Tidak ada TTY yang hadir saat menjalankan perintah melalui SSH di sini-dokumen


10

Saya mencoba menjalankan perintah melalui SSH seperti ini di dokumen-sini:

ssh example.com <<END
sudo /etc/init.d/apache2 reload
END

Yang biasanya berfungsi kecuali ketika saya mencoba menjalankan sesuatu yang membutuhkan input, seperti kata sandi untuk sudo. Dalam hal ini, saya menerima pesan berikut:

sudo: no tty present and no askpass program specified

Saya tahu saya bisa menggunakan -tbendera pada SSH untuk mengalokasikan pseudo-tty seperti ini:

ssh -t example.com "sudo /etc/init.d/apache2 reload"

Dan itu akan berhasil, tetapi ketika saya mencoba hal yang sama dengan dokumen di sini, itu tidak berfungsi dan saya akan mendapatkan kesalahan yang sama tentang tidak hadirnya:

ssh -t example.com <<END
sudo /etc/init.d/apache2 reload
END

Adakah yang tahu bagaimana saya bisa membuat ini bekerja?

Juga, jika Anda bertanya-tanya mengapa saya ingin itu bekerja dengan dokumen-sini daripada hanya meneruskannya pada baris yang sama, itu karena perintah input (mungkin ada beberapa) berasal dari file konfigurasi yang dibaca oleh skrip dan saya sudah mendengarnya menghindari kesulitan melarikan diri dari perintah untuk tanda kutip, tanda kutip ganda, dll.

Jawaban:


6

Gunakan visudountuk mengedit file sudoers dan menyisipkan baris di bawah ini:

Defaults:<user>    !requiretty

Itu tidak menjawab mengapa menggunakan ssh -t "something" versus ssh -t <<STOP something STOPtidak berhasil. Katakanlah saya tidak menggunakan sudo tetapi saya menggunakan passwd untuk pengguna saya sendiri secara langsung, saya masih tidak akan mendapatkan TTY menggunakan heredoc.

Cobalah ssh -t -tuntuk memaksakan alokasi pseudo-tty bahkan jika stdin bukan terminal.


Terima kasih, saya telah melihat perbaikan ini di tempat lain, tetapi ini hanya berlaku untuk masalah perintah yang menggunakan sudo. Itu tidak menjawab mengapa menggunakan ssh -t "sesuatu" versus ssh -t << BERHENTI sesuatu STOP tidak bekerja. Katakanlah saya tidak menggunakan sudo tetapi saya menggunakan passwd untuk pengguna saya sendiri secara langsung, saya masih tidak akan mendapatkan TTY menggunakan heredoc.
lpfavreau

Saya telah memperbarui jawaban saya.
quanta

1

Mengapa tidak menyimpan saja dokumen di sini dalam variabel yang akan diberikan ssh -tsebagai argumen perintah.

Pada catatan yang lebih umum, gunakan ssh -Tatau tentukan shell jarak jauh sebagai argumen perintah jika stdin dari host jarak jauh sedang dialihkan dari heredoc (untuk mencegah sshmencoba mengalokasikan pty).

# store heredoc in a variable
heredoc="$(cat <<EOF
who
sudo ls -ld /
logname
EOF
)"

ssh -t localhost "$heredoc"


# avoid: Pseudo-terminal will not be allocated because stdin is not a terminal.
- ssh example.com <<END
+ ssh -T example.com <<END
+ ssh example.com /bin/sh <<END
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.