menggunakan su di dalam skrip shell


12

Saya mengotomatiskan proses penyebaran dan saya ingin dapat hanya memanggil satu file .sh di mesin saya, minta saya membuat dan mengunggah .zip ke server dan kemudian melakukan banyak hal di server. Salah satu hal yang perlu saya lakukan mengharuskan saya menjadi root. Jadi, yang ingin saya lakukan adalah ini:

ssh user@172.1.1.101 <<END_SCRIPT
su - 
#password... somehow...
#stop jboss
service server_instance stop
#a bunch of stuff here
#all done!
exit
END_SCRIPT

Apakah ini mungkin?


+1 pertanyaan bagus. masalah umum.
gMale

Jawaban:


15

Sudahkah Anda mempertimbangkan sudo tanpa kata sandi?


1
Ini adalah pendekatan yang saya gunakan di masa lalu. Anda dapat membatasi sudo ke perintah yang diperlukan (memulai / menghentikan layanan), membatasi hak istimewa yang dimiliki pengguna sesuai dengan yang Anda butuhkan. Masih terasa kikuk, tetapi berhasil.
Markus

Inilah yang akhirnya saya lakukan ...
cmcculloh

5

Alih-alih su, gunakan sudo dengan NOPASSWD yang diatur dalam sudoers untuk perintah yang sesuai. Anda akan ingin membuat perintah yang diizinkan dibuat sebatas mungkin. Setelah itu panggil jalankan skrip untuk perintah root mungkin merupakan cara terbersih dan sejauh ini termudah untuk mengamankan jika Anda tidak terbiasa dengan sintaks file sudoer. Untuk perintah / skrip yang membutuhkan lingkungan penuh untuk dimuat, sudo su - -c commandberfungsi meskipun mungkin berlebihan.



3

Anda bisa meneruskan perintah sebagai argumen ke SSH untuk menjalankan perintah itu di server, dan kemudian keluar:

ssh user@host "command to run"

Ini juga berfungsi untuk daftar beberapa perintah:

ssh user@host "command1; command2; command3"

Atau sebagai alternatif:

ssh user@host "
        command1
        command2
        command3
"

Seperti yang ditunjukkan oleh pengguna lain sebelum saya, menjalankan suserver akan meluncurkan shell baru alih-alih mengeksekusi perintah berikutnya dalam skrip sebagai root. Yang perlu Anda lakukan adalah menggunakan salah satu sudoatau su -c, dan memaksa alokasi TTY ke SSH dengan -tsaklar (diperlukan jika Anda perlu memasukkan kata sandi root):

ssh -t user@host 'su - -c "command"'
ssh -t user@host 'sudo command'

Singkatnya, satu cara untuk mencapai apa yang ingin Anda lakukan, adalah:

#!/bin/bash
ssh -t user@172.1.1.101 "
        sudo some_command
        sudo service server_instance stop
        sudo some_other_command
"

Karena sudobiasanya mengingat tingkat otorisasi Anda selama beberapa menit sebelum meminta kata sandi root lagi, hanya dengan menambahkan sudosemua perintah yang perlu Anda jalankan sebagai root kemungkinan cara termudah untuk menjalankan perintah sebagai root di server. Menambahkan NOPASSWDaturan untuk pengguna Anda /etc/sudoersakan membuat proses lebih lancar.

Saya harap ini membantu :-)


Jika Anda memerlukan informasi lebih lanjut tentang menambahkan NOPASSWDaturan itu, periksa contoh di bagian bawah man sudoers. Juga, ingatlah untuk menggunakan visudosaat mengedit sudoersfile Anda untuk menghindari kerusakan!
jabirali

Saya tidak bisa menjalankan su - -c "command". Bagaimana saya memasok kata sandi untuk su?
cmcculloh

Jika Anda memilih untuk menggunakan su -calih-alih sudo, Anda harus menjalankan SSH dengan -tbenderanya - Anda akan diminta untuk memasukkan kata sandi root di server ketika perintah dijalankan. Memberikan kata sandi secara langsung susebagai argumen baris perintah tidak didukung (sejauh yang saya tahu), atau disarankan - karena sederhana ps -ef | grep sumengungkapkan semua argumen yang diteruskan su, termasuk kata sandi yang diberikan dari baris perintah ...
jabirali

Adapun cara Anda memohon su -cSSH: ssh -t user@host 'su -lc "<br /> echo this is a test <br /> echo this is another test<br /> "<br />'
jabirali

Ganti yang di <br />atas dengan baris baru di skrip Anda. Di luar topik: Bisakah Anda menambahkan baris baru ke komentar ServerFault? Itu akan sangat berguna ketika memposting potongan kode ...
jabirali

2

Tidak. Bahkan jika Anda mendapatkan kata sandi su, Anda masih harus berurusan dengan fakta yang suakan membuka shell baru, yang berarti bahwa perintah Anda selanjutnya tidak akan diteruskan ke sana. Anda harus menulis skrip untuk operasi root bersama dengan pembantu yang dapat dieksekusi yang dapat menjalankannya dengan hak istimewa yang sesuai.


2
Sebagian besar perintah su menerima opsi -c yang akan dijalankan sebagai argumen. Saya setuju bahwa skrip di server itu sendiri mungkin paling baik vs. mengirim semua cmds melalui ssh.
Aaron Bush

1

Tulis skrip harapan. Saya tahu Anda sudah menemukan jawaban untuk ini, tetapi ini mungkin membantu jika Anda harus masuk ke sekelompok server yang memerlukan entri kata sandi interaktif.

Ini adalah bahasa yang didasarkan pada TCL, jadi mungkin agak aneh dibandingkan dengan skrip shell lama. Tetapi ia menangani otomatisasi input teks dan, Anda dapat menebaknya, "mengharapkan" bit-bit output tertentu sebelum memasukkan segala jenis entri kata sandi otomatis atau meningkatkan hak istimewa.

Berikut ini tautan yang bagus sebagai panduan: http://bash.cyberciti.biz/security/expect-ssh-login-script/

Kalau-kalau situs turun:

#!/usr/bin/expect -f
# Expect script to supply root/admin password for remote ssh server
# and execute command.
# This script needs three argument to(s) connect to remote server:
# password = Password of remote UNIX server, for root user.
# ipaddr = IP Addreess of remote UNIX server, no hostname
# scriptname = Path to remote script which will execute on remote server
# For example:
#  ./sshlogin.exp password 192.168.1.11 who
# ------------------------------------------------------------------------
# Copyright (c) 2004 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ----------------------------------------------------------------------
# set Variables
set password [lrange $argv 0 0]
set ipaddr [lrange $argv 1 1]
set scriptname [lrange $argv 2 2]
set arg1 [lrange $argv 3 3]
set timeout -1
# now connect to remote UNIX box (ipaddr) with given script to execute
spawn ssh root@$ipaddr $scriptname $arg1
match_max 100000
# Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof

1

Saya tahu ini agak terlambat tetapi saya pribadi akan menggunakan Net :: SSH :: Expect, tersedia dari CPAN.

http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod


Harapkan sangat bagus dalam banyak kasus jika Anda tidak dapat menggunakan skrip ssh / bash biasa. Namun, itu juga menjadi sangat kikuk dengan cepat dan membuat Anda menganggap "apa pun yang Anda temukan" pada ujung jarak jauh. Jika Anda dapat mengubah sistem target atau pengaruh bagaimana berperilaku sama sekali saya akan merekomendasikan mencoba rute yang berbeda pertama. Poin yang bagus untuk membawanya ke sini.
Theuni

0

Anda dapat menggunakan 'ssh example.com su -lc "$ cmd"'.

Ketika perintah berisi opsi, Anda perlu mengutipnya, jika tidak, "su" dapat memakannya ("su: opsi tidak valid - 'A').

ssh -AX -tt example.com 'su -lc "tmux new-session -A"'
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.