SSH + Sudo + Bash 스크립트의 예상: 원격 시스템에서 sudo를 사용하여 명령 실행

SSH + Sudo + Bash 스크립트의 예상: 원격 시스템에서 sudo를 사용하여 명령 실행

스크립트를 사용하여 일부 .deb 패키지 배포를 자동화하려고 합니다. sudo dpkg -i $myDeb.debSSH를 통해 액세스할 수 있는 원격 컴퓨터 목록에서 실행 하고 싶습니다 .

Bash 스크립트에서 "expect"를 사용하여 명령을 자동화하려고 하는데 여러 가지 다른 오류가 발생하여 분명히 뭔가 잘못된 것 같습니다(기본적으로 따옴표를 넣은 위치에 따라 다름).

다음은 제가 가지고 있는 함수입니다(다음과 함께 호출됩니다: _remoteInstallation "myPackage115.deb" "192.168.1.55". 원격 시스템에서 .deb가 $HOME/Documents/에 있을 것이라는 것을 알고 있습니다:

function _remoteInstallation(){
    local retval=1
    local debToInstall=$(basename "$1")
    local remoteMachine="$2"
    spawned=$(expect -d -c "
          set timeout 1800
          spawn "/usr/bin/ssh -t borrajax@$remoteMachine /usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall"'
          expect {
                \"Are you sure you want to continue connecting\" { send \"yes\r\"; exp_continue }
                \"password\" { send \"myPassword\r\";  exp_continue }
                \"[sudo] password\" { send \"myPassword\r\";  exp_continue }
                default { exit 1 }
          }
    " )
    retval=$?
    return $retval
}

이와 같이 생성된 영역에 따옴표를 사용하면 다음과 같은 결과를 얻을 수 있습니다.

expect: invalid option -- 't'

내가 그것을 다음과 같이 바꾸면 :

 spawn /usr/bin/ssh -t borrajax@$remoteMachine '/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall'

sudo dpkg 명령을 로컬로 실행하려고 하는 것 같습니다(먼저 "$remoteMachine"으로 ssh를 실행한 다음 두 개의 개별 명령처럼 로컬로 sudo dpkg를 실행합니다).

이것으로:

spawn '/usr/bin/ssh -t borrajax@$remoteMachine \'/usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall\''

알겠습니다 couldn't execute "'/usr/bin/ssh": no such file or directory(사실이 아닙니다)

...지금은 아이디어가 부족해요...:-)

어떤 조언이라도 대단히 감사하겠습니다. 감사해요.

답변1

나는 당신이 특정 수준의 인용 이스케이프를 놓치고 있다고 생각합니다. 이러한 종류의 높은 수준의 이스케이프에서는 인용해야 할 각 단계에 대해 간단한 스크립트를 만드는 것이 가장 좋습니다.

그렇지 않으면 이 수정된 버전을 사용해 볼 수 있습니다(그러나 이 코딩 스타일은 권장하지 않습니다!).

function _remoteInstallation(){
    local retval=1
    local debToInstall=$(basename "$1")
    local remoteMachine="$2"
    spawned=$(expect -d -c "
          set timeout 1800
          spawn \"/usr/bin/ssh -t borrajax@$remoteMachine /usr/bin/sudo /usr/bin/dpkg -i /home/borrajax/Documents/$debToInstall\"
          expect {
                \"Are you sure you want to continue connecting\" { send \"yes\r\"; exp_continue }
                \"password\" { send \"myPassword\r\";  exp_continue }
                \"[sudo] password\" { send \"myPassword\r\";  exp_continue }
                default { exit 1 }
          }
    " )
    retval=$?
    return $retval
}

답변2

왜 사람들은 이런 못생긴 expect물건을 계속 사용하는 걸까요 ssh? SSH 키를 사용하세요( ssh-copy-id remotemachine완전히 연습 하려면 공개 키 암호화 이론을 읽어보세요 ). 그럼 사용법은 아주 간단해요

ssh remote-machine "remote-shell-command" > local-redirection-of-command-output

3가지 수준의 참조 사이를 전환할 필요가 없으면 자연스럽게 올바른 명령을 작성하게 됩니다.

관련 정보