शेल स्क्रिप्ट के अंदर su का उपयोग करना


12

मैं एक परिनियोजन प्रक्रिया को स्वचालित कर रहा हूं और मैं अपनी मशीन पर सिर्फ एक .sh फ़ाइल को कॉल करने में सक्षम होना चाहता हूं, यह मेरे पास है और .zip को सर्वर पर अपलोड करें और फिर सर्वर पर सामान का एक गुच्छा करें। मुझे जिन चीजों की आवश्यकता है, उनमें से एक मुझे रूट करने की आवश्यकता है। तो, मैं यह करना चाहता हूं:

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

क्या यह भी संभव है?


+1 अच्छा सवाल। आम समस्या।
galeale

जवाबों:


15

क्या आपने इसके बजाय एक पासवर्ड-कम sudo माना है?


1
यह वह तरीका है जो मैंने अतीत में इस्तेमाल किया है। आप sudo को आवश्यक कमांड तक सीमित कर सकते हैं (सेवा को शुरू / बंद कर सकते हैं), विशेषाधिकारों को सीमित करके उपयोगकर्ता को ठीक वही चाहिए जो आपको चाहिए। यह अभी भी भद्दा लगता है, लेकिन काम करता है।
मार्क

यह वास्तव में मैं क्या कर रहा है ...
cmcculloh

5

सु के बजाय, उपयुक्त कमांड (एस) के लिए सूडो में सेट NOPASSWD के साथ सुडो का उपयोग करें। आप अनुमत कमांड को यथासंभव सीमित बनाना चाहते हैं। यह रूट कमांड के लिए एक स्क्रिप्ट रन कॉल करने के लिए सबसे साफ तरीका हो सकता है और अगर आप sudoer फ़ाइल सिंटैक्स से अपरिचित हैं तो सुरक्षित बनाने के लिए सबसे आसान तरीका है। आदेशों / लिपियों के लिए जिन्हें पूरे वातावरण को लोड करने की आवश्यकता होती है, sudo su - -c commandहालांकि ओवरकिल हो सकते हैं।



3

आप उस आदेश को सर्वर पर चलाने के लिए SSH के तर्क के रूप में पास कर सकते हैं और फिर बाहर निकल सकते हैं:

ssh user@host "command to run"

यह कई कमांड की सूची के लिए भी काम करता है:

ssh user@host "command1; command2; command3"

या वैकल्पिक रूप से:

ssh user@host "
        command1
        command2
        command3
"

जैसा कि अन्य उपयोगकर्ताओं ने मुझसे पहले कहा है, suसर्वर पर चल रहा है स्क्रिप्ट के बाद के कमांड को रूट के रूप में निष्पादित करने के बजाय एक नया शेल लॉन्च करेगा। आपको क्या करने की आवश्यकता है, sudoया तो स्विच के su -cसाथ SSH को TTY आवंटन का उपयोग करने के लिए या मजबूर -tकरना है (यदि आपको आवश्यक डेटा दर्ज करना है):

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

इसे पूरा करने के लिए, जो आप करना चाहते हैं उसे पूरा करने का एक तरीका होगा:

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

चूंकि sudoआम तौर पर रूट पासवर्ड दोबारा पूछने से पहले आपको कुछ मिनटों के लिए प्राधिकरण स्तर याद रहता है, बस sudoसभी कमांड्स जो आपको चलाने की जरूरत है, के लिए प्रीपेड करना रूट को सर्वर पर रूट के रूप में कमांड चलाने का सबसे आसान तरीका है। NOPASSWDअपने उपयोगकर्ता के लिए एक नियम जोड़ना /etc/sudoersइस प्रक्रिया को और भी आसान बना देगा।

आशा है कि ये आपकी मदद करेगा :-)


यदि आपको उस NOPASSWDनियम को जोड़ने के बारे में अधिक जानकारी की आवश्यकता है , तो नीचे दिए गए उदाहरण देखें man sudoers। इसके अलावा, टूटने से बचने के लिए visudoअपनी sudoersफ़ाइल को संपादित करते समय उपयोग करना याद रखें !
जाबरीली

मुझे काम करने के लिए su - -c "कमांड" नहीं मिल सकता है। मैं सु के लिए पासवर्ड की आपूर्ति कैसे करूंगा?
cmcculloh

यदि आप su -cइसके बजाय उपयोग करना चुनते हैं sudo, तो आपको -tध्वज के साथ SSH चलाना चाहिए - कमांड निष्पादित होने पर आपको सर्वर पर रूट पासवर्ड के लिए संकेत दिया जाएगा। suकमांड लाइन तर्क के रूप में सीधे पासवर्ड प्रदान करना न तो समर्थित है (जहां तक ​​मुझे पता है), और न ही अनुशंसित - चूंकि एक साधारण ps -ef | grep suसे सभी तर्क दिए गए हैं su, जिसमें कमांडलाइन से प्रदान किया गया कोई पासवर्ड भी शामिल है ...
jabirali

कैसे आप आह्वान के रूप में su -cSSH पर: ssh -t user@host 'su -lc "<br /> echo this is a test <br /> echo this is another test<br /> "<br />'
jabirali

<br />अपनी स्क्रिप्ट में उपरोक्त को नई लिपि से बदलें । ऑफ-टॉपिक: क्या आप सर्वरफॉल्ट टिप्पणियों में नई सूची जोड़ सकते हैं? कोड स्निपेट्स पोस्ट करते समय यह काफी उपयोगी होगा ...
जबरीली

2

नहीं। यदि आपको पासवर्ड मिल suभी जाता है , तो भी आपको इस तथ्य से निपटना suहोगा कि एक नया शेल खोलेगा, जिसका अर्थ है कि आपके आगे के कमांड इसे पास नहीं करेंगे। आपको रूट संचालन के लिए एक सहायक के साथ एक स्क्रिप्ट लिखने की आवश्यकता होगी जो एक सहायक निष्पादन योग्य है जो इसे उपयुक्त विशेषाधिकारों के साथ आमंत्रित कर सकता है।


2
अधिकांश र कमांड आदेश -c विकल्प को स्वीकार करते हैं जो एक तर्क को चलाने के लिए कमांड (एस) के रूप में लेगा। मैं सहमत हूं कि सर्वर पर एक स्क्रिप्ट संभवतः सबसे अच्छा है बनाम ssh पर सभी cmds भेज रहा है।
एरोन बुश

1

एक उम्मीद की स्क्रिप्ट लिखें। मुझे पता है कि आपको पहले से ही इसके लिए एक उत्तर मिल गया है, लेकिन यह मददगार हो सकता है अगर आपको ऐसे सर्वर का एक गुच्छा लॉगिन करना है जिसमें इंटरेक्टिव पासवर्ड की आवश्यकता हो।

यह TCL से दूर की भाषा है, इसलिए यह सादे पुराने शेल स्क्रिप्ट की तुलना में थोड़ा अजीब हो सकता है। लेकिन यह टेक्स्ट इनपुट के स्वचालन को संभालता है और, आपने अनुमान लगाया है, किसी भी प्रकार के स्वचालित पासवर्ड प्रविष्टि या विशेषाधिकारों में वृद्धि से पहले आउटपुट के कुछ बिट्स की "अपेक्षा" करता है।

यहां एक गाइड के रूप में एक अच्छी कड़ी है: http://bash.cyberciti.biz/security/expect-ssh-login-script/

साइट के नीचे जाने की स्थिति में:

#!/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

मुझे पता है कि यह थोड़ा देर से है, लेकिन मैं व्यक्तिगत रूप से नेट :: एसएसएच :: एक्सपेक्ट का उपयोग करूंगा, सीपीएएन से उपलब्ध होगा।

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


यदि आप नियमित रूप से ssh / bash स्क्रिप्टिंग का उपयोग नहीं कर सकते हैं, तो उन मामलों में से कई में उम्मीद करना बहुत अच्छा है। हालांकि, यह भी वास्तव में जल्दी से क्लूनी हो जाता है और आपको दूरस्थ छोर पर "जो भी आप पाते हैं" मान लेते हैं। आप यह कैसे बर्ताव करता है लक्ष्य प्रणाली या प्रभाव बदल सकते हैं सब पर मैं एक अलग रास्ता पहले की कोशिश कर की सिफारिश करेंगे। हालांकि इसे यहाँ लाने के लिए अच्छी बात है।
औनी

0

आप 'ssh example.com su -lc "$ cmd" का उपयोग कर सकते हैं।

जब कमांड में विकल्प होते हैं, तो आपको इसे उद्धृत करना होगा, अन्यथा "सु" उन्हें खा सकता है ("सु: अमान्य विकल्प - 'ए')।

ssh -AX -tt example.com 'su -lc "tmux new-session -A"'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.