cara yang tepat untuk sudo lewat ssh


150

Saya memiliki skrip yang menjalankan skrip lain melalui SSH pada server jarak jauh menggunakan sudo. Namun, ketika saya mengetik kata sandi, kata itu muncul di terminal. (Kalau tidak berfungsi dengan baik)

ssh user@server "sudo script"

Apa cara yang tepat untuk melakukan ini sehingga saya bisa mengetikkan kata sandi untuk sudo melalui SSH tanpa kata sandi muncul saat saya mengetik?


2
bagi saya, alasan untuk mencari cara sudoing melalui ssh adalah bahwa itu tidak berfungsi ketika mencoba sesuatu seperti ssh <user@server> sudo <script>, karena saya mendapatkan kesalahansudo: no tty present and no askpass program specified
knocte

Jawaban:


244

Cara lain adalah dengan menggunakan -tsakelar ke ssh:

ssh -t user@server "sudo script"

Lihat man ssh:

 -t      Force pseudo-tty allocation.  This can be used to execute arbi-
         trary screen-based programs on a remote machine, which can be
         very useful, e.g., when implementing menu services.  Multiple -t
         options force tty allocation, even if ssh has no local tty.

2
Bagus, saya tahu opsi -t, hanya tidak tahu itu berfungsi untuk meminta sudo.

3
untuk apa opsi -t?
Vince


3
Ini tidak berfungsi di sini: ssh -t localhost <<< "sudo touch file;"EDIT Tampaknya penting bahwa Anda benar-benar memberikan perintah sebagai parameter, bukan melalui standar dalam (yang masuk akal di belakang).
Penebusan Terbatas

yang -tmetode juga akan menunjukkan output berwarna perintah yang biasanya melakukannya.
karmakaze

24

Saya dapat mengotomatisasi sepenuhnya dengan perintah berikut:

echo pass | ssh -tt user@server "sudo script"

Keuntungan:

  • tidak ada kata sandi prompt
  • tidak akan menampilkan kata sandi dalam riwayat pesta mesin jarak jauh

Mengenai keamanan: seperti yang dikatakan Kurt , menjalankan perintah ini akan menunjukkan kata sandi Anda pada riwayat bash lokal Anda, dan lebih baik menyimpan kata sandi dalam file yang berbeda atau menyimpan semua perintah dalam file .sh dan menjalankannya. CATATAN: File harus memiliki izin yang benar sehingga hanya pengguna yang diizinkan yang dapat mengaksesnya.


8
Ini akan muncul pada riwayat bash sistem lokal, termasuk kata sandi. Lebih baik menyimpan kata sandi dalam file dan menyimpan file.
Kurt Fitzner

4
Ya ampun, aku tahu -t, tetapi aku belum cukup membaca buku panduannya dengan seksama untuk memastikan bahwa kamu bisa melewatinya dua kali! Ini yang saya cari selama berbulan - bulan! Sebagai tambahan keamanan, saya cukup mengatur variabel kata sandi sebelum menjalankan read -s -p "Password: " pw, lalu melakukannya echo "$pw" | ..... Saya sekarang telah menggulung ini menjadi skrip praktis untuk saya sendiri :).
kael

Bekerja seperti pesona bagiku!
MiKr13

Mengapa Anda tidak mengatur sudo tanpa kata sandi untuk pengguna dan perintah spesifik apa pun yang perlu Anda jalankan? Ini bukan masalah SSH ...
nomen

@nomen solusi Anda juga valid, tetapi membutuhkan langkah-langkah tambahan. Jika saya memiliki banyak perangkat tanpa pengguna sudo tanpa kata sandi, saya dapat membuat skrip otomatisasi menggunakan solusi ini. Kadang-kadang Anda bekerja pada sistem yang bukan milik Anda dan Anda tidak ingin atau tidak bisa membuat perubahan, terkadang ada pertimbangan lain.
ofirule

6

Dengan asumsi Anda tidak menginginkan prompt kata sandi :

ssh $HOST 'echo $PASSWORD | sudo -S $COMMMAND'

Contoh

ssh me@localhost 'echo secret | sudo -S echo hi' # outputs 'hi'

14
Ini / sangat / berbahaya karena kata sandi plaintext berakhir pada baris perintah. Baris perintah bersifat publik dan dapat dilihat oleh setiap pengguna lain dan proses pada sistem. Misalnya, "ps auxwwwww" oleh pengguna yang tidak memiliki hak akan menampilkan setiap proses yang berjalan dan baris perintah yang menjalankannya.
Kurt Fitzner

3
Belum lagi memasukkan kata sandi Anda (dalam plaintext) ke dalam file bash_history.
Layne Bernardo

4

Sudo melalui SSH yang mengirimkan kata sandi, tidak perlu:

Anda dapat menggunakan sudo lebih dari ssh tanpa memaksa ssh untuk memiliki pseudo-tty (tanpa menggunakan saklar ssh "-t") dengan mengatakan sudo untuk tidak memerlukan kata sandi interaktif dan untuk hanya mengambil kata sandi dari stdin. Anda melakukan ini dengan menggunakan sakelar "-S" pada sudo. Ini membuat sudo mendengarkan kata sandi di stdin, dan berhenti mendengarkan ketika melihat baris baru.

Contoh 1 - Perintah Remote Sederhana

Dalam contoh ini, kami mengirim whoamiperintah sederhana :

$ ssh user@server cat \| sudo --prompt="" -S -- whoami << EOF
> <remote_sudo_password>
root

Kami memberi tahu sudo untuk tidak mengeluarkan prompt, dan untuk mengambil input dari stdin. Hal ini membuat kata sandi sudo yang lewat benar-benar hening sehingga satu-satunya respons yang Anda dapatkan adalah keluaran dari whoami.

Teknik ini memiliki manfaat memungkinkan Anda untuk menjalankan program melalui sudo over ssh yang membutuhkan input stdin sendiri. Ini karena sudo mengonsumsi kata sandi melalui baris pertama stdin, lalu membiarkan program apa pun yang dijalankan terus mengambil stdin.

Contoh 2 - Perintah Jauh Yang Membutuhkan stdin Sendiri

Pada contoh berikut, perintah jarak jauh "cat" dijalankan melalui sudo, dan kami menyediakan beberapa baris tambahan melalui stdin untuk ditampilkan oleh kucing jarak jauh.

$ ssh user@server cat \| sudo --prompt="" -S -- "cat" << EOF
> <remote_sudo_password>
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

Keluaran menunjukkan bahwa <remote_sudo_password>garis dikonsumsi oleh sudo, dan bahwa kucing yang dieksekusi dari jarak jauh kemudian menampilkan garis ekstra.

Contoh di mana ini akan bermanfaat adalah jika Anda ingin menggunakan ssh untuk meneruskan kata sandi ke perintah istimewa tanpa menggunakan baris perintah. Katakanlah, jika Anda ingin memasang wadah terenkripsi jauh melalui ssh.

Contoh 3 - Memasang Wadah VeraCrypt Jarak Jauh

Dalam contoh skrip ini, kami sedang memasang wadah VeraCrypt dari jarak jauh melalui sudo tanpa teks tambahan yang diminta:

#!/bin/sh
ssh user@server cat \| sudo --prompt="" -S -- "veracrypt --non-interactive --stdin --keyfiles=/path/to/test.key /path/to/test.img /mnt/mountpoint" << EOF
SudoPassword
VeraCryptContainerPassword
EOF

Perlu dicatat bahwa dalam semua contoh baris perintah di atas (semuanya kecuali skrip) << EOFkonstruk pada baris perintah akan menyebabkan semua yang diketik, termasuk kata sandi, direkam dalam sejarah .bash_history mesin lokal . Oleh karena itu sangat disarankan bahwa untuk penggunaan di dunia nyata Anda menggunakan melakukannya sepenuhnya melalui skrip, seperti contoh veracrypt di atas, atau, jika pada baris perintah maka masukkan kata sandi dalam file dan arahkan file tersebut melalui ssh.

Contoh 1a - Contoh 1 Tanpa Kata Sandi Baris Perintah Lokal

Contoh pertama akan menjadi:

$ cat text_file_with_sudo_password | ssh user@server cat \| sudo --prompt="" -S -- whoami
root

Contoh 2a - Contoh 2 Tanpa Kata Sandi Baris Perintah Lokal

dan contoh kedua akan menjadi:

$ cat text_file_with_sudo_password - << EOF | ssh va1der.net cat \| sudo --prompt="" -S -- cat
> Extra line1
> Extra line2
> EOF
Extra line1
Extra line2

Memasukkan kata sandi dalam file terpisah tidak perlu jika Anda memasukkan semuanya ke dalam skrip, karena isi skrip tidak berakhir dalam riwayat Anda. Meskipun demikian, ini mungkin masih berguna, jika Anda ingin mengizinkan pengguna yang tidak melihat kata sandi untuk menjalankan skrip.


Pada perintah ssh remote, mengapa Anda perlu menjalankan catdan mengirimkan hasilnya ke sudo? Bisakah Anda menggunakan sudoperintah remote ssh utama?
joanpau

@ joanpau Inisial catdigunakan untuk menyalurkan kata sandi pengguna melalui sudo di sisi lain. Jika pengguna dapat menjalankan sudo tanpa kata sandi, maka itu tidak diperlukan, tetapi saya tidak menyarankan konfigurasi ini. Alasannya disalurkan adalah untuk mencegah kata sandi muncul di baris perintah sysrtem jarak jauh. Baris perintah tidak aman, setiap pengguna dapat melihat setiap baris perintah ps auxwww.
Kurt Fitzner

Saya meminta catperintah ssh cat \| sudo --prompt="" -S.... Jika -Skekuatan sudountuk membaca kata sandi dari stdin, apakah kucing dan pipa diperlukan sama sekali? Mungkinkah perintah ssh begitu saja sudo --prompt="" -S...?
joanpau

@jonpau Perintah cat itu mengambil stdin dan menyalurkannya melalui sudo untuk memberikannya kata sandi sudo. Ini menunjukkan bagaimana Anda dapat mengirimkan kata sandi sudo melalui ssh melalui stdin dengan aman.
Kurt Fitzner

1

Cara terbaik adalah ssh -t user@server "sudo <scriptname>", misalnya ssh -t user@server "sudo reboot". Ini akan meminta kata sandi untuk pengguna terlebih dahulu dan kemudian melakukan root (karena kita menjalankan skrip atau perintah dengan privilege root.

Saya harap ini membantu dan menghilangkan keraguan Anda.




-1

Saya menghadapi masalah,

user1@server1$ ssh -q user1@server2 sudo -u user2 rm -f /some/file/location.txt

Output:
sudo: no tty present and no askpass program specified

Lalu aku mencoba

#1
vim /etc/sudoers
Defaults:user1    !requiretty

tidak bekerja

#2
user1   ALL=(user2)         NOPASSWD: ALL

itu bekerja dengan baik!


Ini tidak benar-benar memenuhi apa yang diminta. Idenya adalah masih memerlukan kata sandi, tetapi biarkan diketik di atas ssh. Apa yang telah Anda lakukan hanya diberikan pengguna sudo akses penuh ke user2 tanpa kata sandi. Ini bagus untuk aplikasi tertentu, tetapi bukan ide terbaik sebagai solusi umum.
Possum

-7

Bergantung pada penggunaan Anda, saya berhasil dengan yang berikut:

ssh root@server "script"

Ini akan meminta kata sandi root dan kemudian menjalankan perintah dengan benar.


26
Astaga, SSH sebagai root? Itu ide yang buruk karena segala macam alasan.
darkfeline

12
Ingat ssh bukan telnet. Tidak berbahaya untuk ssh sebagai root daripada ssh sebagai pengguna lain dan menjalankan sudo. Kata sandi Anda dienkripsi dengan cara yang sama melalui koneksi ssh.
Stéphane

22
Stéphane benar-benar benar sejauh keamanan kata sandi berjalan. Namun, dengan menggunakan root alih-alih sudo, Anda kehilangan jejak audit yang sesuai dengan sudo. Selain itu, akses root mungkin tidak tersedia.
djeikyb
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.