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!


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.


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 mrhyner@stg-app3.indeed.net << 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

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/*/*'"

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 mrhyner@test-server.net "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
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.