Bagaimana cara meneruskan kata sandi ke su / sudo / ssh tanpa mengesampingkan TTY?

148

Saya sedang menulis program C Shell yang akan dilakukan suatau sudoatau ssh. Mereka semua menginginkan kata sandi mereka di input konsol (TTY) daripada stdin atau baris perintah.

Adakah yang tahu solusi?

Menyiapkan kata sandi-kurang sudobukanlah pilihan.

bisa menjadi pilihan, tetapi tidak ada pada sistem saya yang sederhana.

al-alexander
sumber
SSH: serverfault.com/questions/241588/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件 法轮功

Jawaban:

215

Untuk sudo ada opsi -S untuk menerima kata sandi dari input standar. Inilah entri man:

    -S          The -S (stdin) option causes sudo to read the password from
                the standard input instead of the terminal device.

Ini akan memungkinkan Anda untuk menjalankan perintah seperti:

echo myPassword | sudo -S ls /tmp

Adapun ssh, saya telah melakukan banyak upaya untuk mengotomatiskan / skrip penggunaannya tanpa hasil. Tampaknya tidak ada cara membangun apa pun untuk memasukkan kata sandi ke dalam perintah tanpa diminta. Seperti yang disebutkan orang lain, utilitas " mengharapkan " sepertinya ditujukan untuk mengatasi dilema ini, tetapi pada akhirnya, mengatur otorisasi kunci pribadi yang benar adalah cara yang tepat untuk dilakukan ketika mencoba mengotomatiskan ini.

Jesse Webb
sumber
2
Untungnya, Ruby memiliki klien SSH bawaan yang memungkinkan Anda menentukan kata sandi. Anda dapat mencoba ruby ​​-e "memerlukan 'net / ssh'; Net :: SSH.start ('example.com', 'test_user',: password => 'secret') do | ssh | menempatkan 'Login berhasil'; sementara cmd = mendapat; menempatkan ssh.exec! (cmd); ujung akhir "
user1158559
13
Saya benci menjadi pembenci pesta di sini, tetapi melakukan ini dapat membuat kata sandi Anda muncul dalam daftar proses. Saya mencoba menentukan cara yang lebih baik dan menemukan artikel ini dan terkejut tidak ada yang menunjukkannya. Solusi hebat, tetapi waspadai risikonya.
Matt
Tentang ssh, sudahkah Anda mencoba memasukkan kata sandi dalam string koneksi? suka nonroot:[email protected]? Tentu saja banyak hal lebih mudah jika Anda menggunakan kunci auth dan manajer kunci.
Killah
12
Hindari kata sandi yang muncul dalam daftar proses atau log file dengan memasukkannya ke dalam file dan menggunakan cat; 'cat pw | sudo -S <command>, dan nanti rm pw.
CAB
Cara lain adalah dengan menggunakan netcat dan mengirimkan kata sandi melalui soket - nc -l 12345 | sudo -S <command>. Di sisi pengirim; echo myPassord | nc <target> 12345. Ini hanya memindahkan masalah penanganan kata sandi, tetapi mungkin ke konsol utama di mana Anda memiliki lebih banyak opsi.
CAB
36

Saya menulis beberapa Applescript yang meminta kata sandi melalui kotak dialog dan kemudian membangun perintah bash khusus, seperti ini:

echo <password> | sudo -S <command>

Saya tidak yakin apakah ini membantu.

Alangkah baiknya jika sudo menerima kata sandi yang dienkripsi, sehingga saya bisa mengenkripsi dalam skrip saya dan tidak khawatir tentang menggema kata sandi teks yang jelas di sekitar. Namun ini bekerja untuk saya dan situasi saya.

mlambie
sumber
27

Untuk sshAnda dapat menggunakan sshpass: sshpass -p yourpassphrase ssh user@host.

Anda hanya perlu mengunduh sshpass terlebih dahulu :)

$ apt-get install sshpass
$ sshpass -p 'password' ssh username@server
Edward
sumber
12

Aku mendapat:

ssh user@host bash -c "echo mypass | sudo -S mycommand"

Bekerja untukku.

David Dawson
sumber
Tidak bekerja untuk saya. masih ssh meminta kata sandi.
AKS
Luar biasa, akhirnya sesuatu yang bisa saya gunakan! Terima kasih. Saya menggunakan ini dalam skrip bash yang memulai sesi ssh dan meneruskan perintah sudo ke klien. Script saya memiliki garis tekad untuk: ssh -t username @ hostname bash -c "sudo echo fartjuice"
James T Snell
12

Untuk sudo Anda dapat melakukan ini juga:

sudo -S <<< "password" command
Jahid
sumber
10

Solusi umum untuk masalah ini adalah menetapkan aplikasi pembantu yang melakukan tugas yang memerlukan akses pengguna super: http://en.wikipedia.org/wiki/Setuid

Sudo tidak dimaksudkan untuk digunakan secara offline.

Sunting nanti: SSH dapat digunakan dengan otentikasi kunci publik-publik. Jika kunci pribadi tidak memiliki kata sandi, ssh dapat digunakan tanpa meminta kata sandi.

diciu
sumber
10

Ini dapat dilakukan dengan menyiapkan kunci publik / pribadi pada host target yang akan Anda sambungkan. Langkah pertama adalah membuat kunci ssh untuk pengguna yang menjalankan skrip pada host lokal, dengan menjalankan:

ssh-keygen
Enter file in which to save the key (/home/myuser/.ssh/id_rsa): <Hit enter for default>
Overwrite (y/n)? y

Kemudian masukkan kata sandi kosong. Setelah itu, salin kunci ssh Anda ke host target yang akan Anda sambungkan.

ssh-copy-id <remote_user>@<other_host>
remote_user@other_host's password: <Enter remote user's password here>

Setelah mendaftarkan kunci ssh, Anda dapat melakukan silent ssh remote_user@other_hostdari host lokal Anda.

Byob
sumber
7

Mungkin Anda bisa menggunakan expectperintah ?:

expect -c 'spawn ssh [email protected];expect password;send "your-password\n";interact

Perintah itu memberikan kata sandi secara otomatis.

adhown
sumber
Terlihat bagus, tapi bagaimana saya bisa mengaktifkan perintah ekspektasi pada maschine tanpa izin root?
Radon8472
1
@ Radon8472 Sebuah executable dapat ditambahkan ke ~ / bin jika Anda tidak memiliki izin untuk menginstalnya. Jika sistem Anda tidak secara otomatis menambahkan ~ / bin ke PATH Anda, Anda dapat melakukannya secara manual dengan mengekspor PATH = "$ PATH: ~ / bin" atau tambahkan perintah itu ke profil Anda untuk melakukannya secara otomatis. Jika Anda tidak ingin mengubah PATH Anda, Anda bisa menjalankan perintah menggunakan path absolutnya: ~ / bin / expect [argumen] Pastikan untuk mengingat untuk mengatur bit yang dapat dieksekusi: chmod + x ~ / bin / expect
StarCrashr
6

Ketika tidak ada pilihan yang lebih baik (seperti yang disarankan oleh orang lain), maka man socat dapat membantu:

   (sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
   socat - EXEC:'ssh -l user server',pty,setsid,ctty

          EXEC’utes an ssh session to server. Uses a pty for communication
          between socat and ssh, makes it ssh’s  controlling  tty  (ctty),
          and makes this pty the owner of a new process group (setsid), so
          ssh accepts the password from socat.

Semua kompleksitas pty, setsid, ctty diperlukan dan, meskipun Anda mungkin tidak perlu tidur selama itu, Anda perlu tidur. Opsi echo = 0 juga layak untuk dilihat, seperti halnya meneruskan perintah jarak jauh pada baris perintah ssh.

Martin Dorey
sumber
1
Ini sebenarnya akan berhasil sujuga. sutidak memiliki opsi -S (stdin).
aus
Apakah mungkin untuk menghindari tidur dan menggunakan sesuatu yang lebih dapat diandalkan?
Michael Pankov
6

Lihatlah expectutilitas linux.

Hal ini memungkinkan Anda untuk mengirim output ke stdio berdasarkan pencocokan pola sederhana di stdin.

Marko
sumber
1

Atur SSH untuk Otentikasi Kunci Publik, tanpa frasa sandi pada Kunci. Banyak panduan di internet. Anda tidak perlu kata sandi untuk masuk. Anda kemudian dapat membatasi koneksi untuk kunci berdasarkan nama host klien. Memberikan keamanan yang masuk akal dan bagus untuk login otomatis.


sumber
1
ssh -t -t [email protected] << EOF
echo SOMEPASSWORD | sudo -S do something
sudo do something else
exit
EOF
Ed Bishop
sumber
Jika Anda dapat masuk sebagai pengguna dengan kunci ssh, untuk akses sudo baik-baik saja: ssh -t user @ host "echo mypassword | sudo -S sudocommand"
Jack
0

Saya memiliki masalah yang sama. skrip dialog untuk membuat direktori pada pc jarak jauh. dialog dengan ssh mudah. Saya menggunakan sshpass (diinstal sebelumnya).

   dialog --inputbox "Enter IP" 8 78 2> /tmp/ip

   IP=$(cat /tmp/ip)


   dialog --inputbox "Please enter username" 8 78 2> /tmp/user

   US=$(cat /tmp/user)


   dialog --passwordbox "enter password for \"$US\" 8 78 2> /tmp/pass

   PASSWORD = $(cat /tmp/pass)


   sshpass -p "$PASSWORD" ssh $US@$IP mkdir -p /home/$US/TARGET-FOLDER


   rm /tmp/ip

   rm /tmp/user

   rm /tmp/pass

Salam dari Jerman

titus

titus
sumber
0

Membangun pada jawaban Jahid, ini bekerja untuk saya di macOS 10.13:

ssh <remote_username>@<remote_server> sudo -S <<< <remote_password> cat /etc/sudoers
JS.
sumber
0

sshpassalternatif yang lebih baik adalah: passh https://github.com/clarkwang/passh

Login ke server jauh

 $ passh -p password ssh user@host

Jalankan perintah di server jauh

 $ passh -p password ssh user@host date

metode lain untuk meneruskan kata sandi

-p Kata sandi (Default: `password ')

-p env: Baca kata sandi dari env var

-p file: Baca kata sandi dari file

di sini saya menjelaskan mengapa itu lebih baik daripada sshpass, dan solusi lainnya.

Badr Elmers
sumber
-1
echo <password> | su -c <command> <user> 

Ini bekerja

DevOz
sumber
1
Ini adalah satu-satunya yang bekerja untuk saya di Fedora. Orang-orang menurunkan pilihan jawaban hanya karena mereka tidak bekerja dalam situasi mereka?
Hangchen Yu
2
"su: harus dijalankan dari terminal" (RPi1B, Raspbian)
notme1560
Sayangnya ini tidak dalam versi terbaru su, yang membaca kata sandi dari stdio sebagai gantinya.
moutonjr
-1

Hardcoding kata sandi dalam skrip harapan sama dengan memiliki sudo tanpa kata sandi, sebenarnya lebih buruk, karena sudo setidaknya mencatat perintahnya.

Aleksandar Ivanisevic
sumber
-1

MENGGUNAKAN:

echo password | sudo command

Contoh:

echo password | sudo apt-get update; whoami

Semoga Itu Membantu ..

Sarat Chandra
sumber
-2

Anda dapat memberikan kata sandi sebagai parameter untuk skrip yang diharapkan.

Marko
sumber
-11
su -c "Command" < "Password"

Semoga bermanfaat.

Shankar
sumber
1
Ini bukan. "su: harus dijalankan dari terminal" adalah jawabannya.
thelogix