SSH: jalankan perintah sudo

44

Saya memiliki skrip shell interaktif, yang di satu tempat perlu ssh ke komputer lain (berbasis Ubuntu) dan menjalankan sesuatu sebagai root (pengguna harus memasukkan kata sandinya, tetapi perintah jarak jauh harus dijalankan seperti yang dicatat dalam skrip):

# ...
ssh remote-machine 'sudo ls'
# ...

Namun, saya selalu mendapatkan pesan kesalahan ini kembali:

sudo: no tty present and no askpass program specified

Oke, itu cukup jelas. Tetapi bagaimana saya bisa mengelak dari ini? Sesuatu seperti ini harus terjadi:

$ ssh remote-machine 'sudo ls /'
[sudo] password for user1:

/bin
/etc
/var
Boldewyn
sumber

Jawaban:

52

Yang menakjubkan sshmemiliki obat untuk semuanya. Intinya adalah menambahkan -tflag untuk memaksa ssh untuk mengalokasikan pseudo-tty:

ssh -t remote-server 'sudo ls'
Boldewyn
sumber
1
Namun, PTY dapat mengacaukan semuanya dengan skrip. lsoutput akan berisi akhiran \ r \ n misalnya.
Tobu
1
Cara mudahnya adalah memaksa ls ke mode non-terminal. ls | catakan melakukan - itu akan melihat bahwa stdout adalah pipa. Dalam pertanyaan khusus ini, itu tidak relevan, karena tampaknya dimaksudkan untuk dijalankan secara interaktif dari terminal - jadi Anda mungkin ingin kolom dan warna dan yang lainnya.
Gabe
0

Metode ini akan menjalankan skrip tunggal menggunakan sudo setelah ssh:

Mari kita asumsikan kita memiliki pengguna "jarak jauh" dengan kemampuan sudo dan kita memiliki skrip yang ingin kita jalankan sebagai root.

1) Atur skrip di / etc / passwd untuk digunakan saat login:

remote:x:1100:1100:Some Remote User,,,:/home/remote:/home/remote/login.sh

2) Di dalam "login.sh", kita menjalankan skrip yang ingin kita jalankan sebagai "sudo":

#!/bin/bash
if [ "$(id -u)" != "0" ]; then
    #Not running as root, so we execute "sudo"
    sudo /usr/local/bin/script.sh
else
    #We are already rooted, so "sudo" is not required.
    /usr/local/bin/script.sh
fi
exit;

Biasanya ia akan menanyakan kata sandi dua kali: ssh login + sudo. Jika Anda hanya ingin memasukkannya sekali, coba sudo tanpa kata sandi (tidak disarankan). <- silakan baca komentar Boldewyn.

Keuntungan utama adalah "ssh" tidak memerlukan parameter lain (as -t), dan sudo dipaksakan di sisi server. Juga, begitu skrip keluar, pengguna juga keluar.

Mungkin tidak elegan, tetapi sederhana dan berhasil.

lepe
sumber
Uh oh. Menempatkan pengguna jarak jauh Anda dalam sudoersfile di server seperti ini adalah bencana yang menunggu untuk terjadi. Jika ada yang mendapatkan akses sebagai pengguna Anda (misalnya melalui server web), ia dapat langsung menjadi root. Terima kasih, tetapi saya sedang mencari solusi, yang tidak menempatkan konfigurasi server saya bertentangan. Jika Anda memiliki solusi, yang entah bagaimana secara ajaib menggunakan kembali otentikasi dari SSH untuk sudoperintah, saya akan lebih tertarik (dan mungkin akan mulai mencari penggantian untuk SSH ...).
Boldewyn
@Boldewyn: ya, pengaturan "sudo tanpa kata sandi" memiliki risiko keamanan ... itu merupakan langkah opsional. Saya setuju dengan Anda, jika SSH dapat menggunakan kembali otentikasi, "solusi" semacam ini tidak diperlukan. Terima kasih atas komentar Anda.
lepe
-1

Anda dapat menjalankan perintah berikut untuk mendapatkan akses root tanpa interaktivitas:

ssh server " sudo command" < sudopassword.txt
SilentGuy
sumber
1
Itu tidak akan berfungsi karena stdin tidak akan menjadi perangkat terminal (itu akan membaca dari file yang ditentukan).
Anthony G - keadilan untuk Monica