Bagaimana cara menggunakan ssh dan sudo bersamaan di bash?

10

Saya belum dapat menemukan pertanyaan yang menjelaskan skenario khusus ini.

Saya mencoba menjalankan skrip bash yang sangat mendasar untuk mengambil logging dari beberapa mesin. Saya menjalankan skrip secara lokal tetapi perlu mengakses mesin eksternal melalui ssh, dan juga sudo menjadi pengguna istimewa pada mesin itu ...

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt

Menjalankan ini dengan sh -x mengungkapkan bash terjebak pada baris 'ssh'. Jadi saya mencoba merevisinya menjadi ini:

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt

Ini juga tampaknya macet tanpa batas. Apakah ada solusi yang lebih baik untuk masalah ini ?? Saya tidak melihat jalan keluar menggunakan sudo su dari apa yang bisa saya katakan ...

Terima kasih atas bantuannya!

Matt124234
sumber
Mengapa memilih dekat? Pertanyaan ini mengenai topik: mengelola perangkat keras atau perangkat lunak server, workstation, penyimpanan atau jaringan, alat yang digunakan untuk mengelola, memantau, atau mengotomatisasi ini
jlliagre

Jawaban:

5

Cara saya mencapai ini di lingkungan saya saat ini, adalah menjalankan ssh dengan -tflag yang memaksa alokasi tty, dan kemudian menjalankan sudo -u root di dalamnya, sebagai berikut:

ssh -t hostname << EOF
  command1
  sudo -u root command2
  sudo -u otheruser "command3 | command4"
  sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

Saya memiliki akun saya di sudoers di sisi jarak jauh sehingga tidak perlu kata sandi.

Contoh ini menunjukkan kepada Anda berbagai cara untuk melakukan ini dalam satu sesi ssh, termasuk menjalankan beberapa perintah dengan bash atau dalam subkulit. Perhatikan juga bahwa jika Anda meletakkan kode di atas ke dalam skrip yang dapat dieksekusi, Anda dapat meneruskan argumen baris perintah ($ 1 dan $ 2) ke ssh dan ini akan diperluas lalu direferensikan di sisi jarak jauh.

Michael Martinez
sumber
Sayangnya karena saya tidak mengelola server jauh, saya yakin saya terjebak menggunakan sudo su di sini. Apakah itu masih berfungsi dalam format ini?
Matt124234
ya itu akan berhasil juga. Anda dapat memasukkan kata sandi saat diminta.
Michael Martinez
Saya sudah mencoba: ssh -t [email protected] << EOF sudo su - adcentrl egrep 'ERROR \ | WARN' / home / adcentrl / cronjobs / log / * / * EOF Tapi saya menerima: "Pseudo -terminal tidak akan dialokasikan karena stdin bukan terminal. "
Matt124234
baik-baik saja. abaikan peringatan itu dan lanjutkan. jika mau, Anda dapat menonaktifkan "RequireTty" di / etc / sudoers di remote
Michael Martinez
5

Jika Anda tidak ingin atau tidak bisa menghentikan sudo yang menanyakan kata sandi, satu trik sederhana adalah membacanya secara lokal dan menyimpannya dalam variabel lokal:

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF
xpmatteo
sumber
1

Jika sudo dikonfigurasi untuk memungkinkan perintah tanpa kata sandi, ini harus melakukan apa yang Anda inginkan:

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

atau

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

tergantung pada apakah Anda ingin file.txtfile dibuat secara lokal atau jarak jauh.

Jika tidak, berikut adalah cara untuk meneruskan kata sandi pengguna jarak jauh ke sudo:

echo mrhyner_password | \
  ssh mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"
Jlliagre
sumber
Sangat menarik. Namun menggunakan ssh tanpa -t memberitahu saya "no tty present". Menambahkan in -t menghapus kesalahan ini tetapi tampaknya tidak menghormati 'sudo su' karena meminta saya untuk kata sandi. Inilah yang khusus saya lakukan: ssh -t [email protected] "sudo su - adcentrl -c egrep" KESALAHAN \ | PERINGATAN "/ home / adcentrl / cronjobs / log / * / *" Ini memberi saya: bash : PERINGATAN: perintah tidak ditemukan kata sandi [sudo] untuk mrhyner:
Matt124234
Maaf, saya tampaknya tidak tahu bagaimana memformat komentar saya dalam hal ini
Matt124234
Saya berasumsi sudo dikonfigurasi untuk menjadi kata sandi untuk akun remote Anda.
jlliagre
dan Anda kehilangan tanda kutip tunggal tambahan.
jlliagre
Itu, yang membuatku beralasan bahwa bash tidak menghormati perintah ssh karena suatu alasan. Itu bertingkah seperti saya mencoba untuk sudo dari host lokal saya = \
Matt124234