perintah ssh dengan kutipan

11

Saya memiliki kesalahan aneh yang tidak dapat saya temukan di sini. Saya ingin mengubah komentar pengguna dengan perintah berikut.

$ sudo usermod -c "New Comment" user

Ini akan berfungsi saat masuk ke server tetapi saya ingin mengotomatiskannya di 20+ server. Biasanya saya bisa menggunakan daftar dan loop melalui server dan menjalankan perintah tetapi dalam kasus ini saya mendapatkan kesalahan.

$ for i in `cat servlist` ; do echo $i ; ssh $i sudo usermod -c "New Comment" user ; done 
serv1
Usage: usermod [options] LOGIN

Options:
lists usermod options

serv2
Usage: usermod [options] LOGIN

Options:
lists usermod options
.
.
.

Ketika saya menjalankan loop ini, ia mengembalikan kesalahan seperti saya menggunakan perintah yang salah tetapi itu akan berjalan dengan baik pada satu server.

Melihat melalui halaman manual ssh saya memang mencoba -tdan -t -tmenandai tetapi itu tidak berhasil.

Saya telah berhasil menggunakan perl -p -i -edalam loop yang sama untuk mengedit file.

Adakah yang tahu alasan mengapa saya tidak bisa mengulanginya?

SpruceTips
sumber

Jawaban:

6
for i in `cat servlist`;do echo $i;ssh $i 'sudo usermod -c "New Comment" user';done

atau

for i in `cat servlist`;do echo $i;ssh $i "sudo usermod -c \"New Comment\" user";done
Mel
sumber
14

SSH mengeksekusi perintah jarak jauh dalam sebuah shell. Ini meneruskan string ke shell jauh, bukan daftar argumen. Argumen yang Anda berikan ke sshperintah digabungkan dengan spasi di antaranya. Argumen untuk sshyang sudo, usermod, -c, New Commentdan user, sehingga remote shell melihat perintah

sudo usermod -c New Comment user

usermodmem Comment- parsing sebagai nama pengguna dan usersebagai parameter ekstra palsu.

Anda perlu meneruskan tanda kutip ke shell jauh sehingga komentar diperlakukan sebagai string. Cara paling sederhana adalah dengan meletakkan seluruh perintah jarak jauh dalam tanda kutip tunggal. Jika Anda membutuhkan satu kutipan dalam perintah itu, gunakan '\''.

ssh "$i" 'sudo usermod -c "Jack O'\''Brian" user'

Alih-alih memanggil sshloop dan mengabaikan kesalahan, gunakan alat yang dirancang untuk menjalankan perintah pada beberapa server seperti pssh, mussh, clusterssh, dll. Lihat Menjalankan perintah secara otomatis melalui SSH pada banyak server

Gilles 'SANGAT berhenti menjadi jahat'
sumber