쉘 스크립트 내부에서 su 사용 작업을 수행 할 수 있기를 원합니다.

배포 프로세스를 자동화하고 있으며 내 컴퓨터에서 하나의 .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

이것이 가능합니까?



답변

대신 암호가없는 sudo를 고려 했습니까?


답변

su 대신 sudo를 적절한 명령에 대해 설정된 NOPASSWD와 함께 sudo를 사용하십시오. 허용 된 명령 세트를 가능한 한 제한적으로 만들고 싶을 것입니다. sudoer 파일 구문에 익숙하지 않은 경우 루트 명령에 대한 스크립트를 호출하여 호출하는 것이 가장 깨끗하고 안전합니다. 전체 환경을로드해야하는 명령 / 스크립트의 경우 sudo su - -c command작동이 너무 많을 수 있습니다.


답변

당신이 묘사 한 것은 expect 로 가능할 수 있습니다 .


답변

SSH에서 인수로 명령을 전달하여 서버에서 해당 명령을 실행 한 다음 종료 할 수 있습니다.

ssh user@host "command to run"

여러 명령 목록에도 적용됩니다.

ssh user@host "command1; command2; command3"

또는 대안으로 :

ssh user@host "
        command1
        command2
        command3
"

다른 사용자가 나보다 앞서 지적했듯이 su서버에서 실행하면 스크립트에서 루트로 후속 명령을 실행하는 대신 새 셸이 시작됩니다. 당신이해야 할 일은, 하나를 사용하는 sudosu -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하면 프로세스가 더 순조로워집니다.

이게 도움이 되길 바란다 🙂


답변

아니요. 암호를 가져도 새 쉘을 여는 su사실을 처리해야합니다. su즉, 추가 명령이 전달되지 않습니다. 적절한 권한으로 스크립트를 호출 할 수있는 도우미 실행 파일과 함께 루트 작업용 스크립트를 작성해야합니다.


답변

expect 스크립트를 작성하십시오. 이미 답변을 찾았지만 대화 형 암호 입력이 필요한 서버에 로그인해야하는 경우 도움이 될 수 있습니다.

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

답변

나는 이것이 조금 늦다는 것을 알고 있지만 개인적으로 CPAN에서 제공하는 Net :: SSH :: Expect를 사용합니다.

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