SSH + Sudo + Expect in Bash 스크립트: 원격 시스템에서 sudo로 명령 실행

SSH + Sudo + Expect in 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 명령을 로컬로 실행하려는 것 같습니다(먼저 ssh를 '$remoteMachine'으로 보낸 다음 두 개의 별도 명령처럼 로컬로 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

비슷한 문제에 대해 내가 사용하는 것은 모든 원격 스크립트를 파일에 넣는 것입니다 /usr/local/bin/debinstall.sh. 귀하의 경우에 대한 제 제안은 다음과 같습니다: 패키지를 넣을 특별한 디렉토리를 만드십시오. /tmp/remoteinstall예를 들어 호출해 보겠습니다. 또한 연결하려는 사용자를 파일에 넣고 암호를 묻는 메시지 없이 /etc/suduers실행되도록 허용하십시오 . 그러면 다음과 같이 보일 것입니다:sudo dpkg -i *debinstall.sh

#!/bin/bash
cd /tmp/remoteinstall
sudo dpkg -i *.deb && rm -f *

이 스크립트를 및 의 소유로 만듭니다 chmod 744 /usr/local/bin/debinstall.sh.

로컬에서 작업은 단순히 .deb 파일을 업로드하고 스크립트를 호출하는 것입니다.

cd /path/to/files
scp * user@remotemachine:/tmp/remoteinstall
ssh user@remotemachine /usr/local/bin/debinstall.sh

debinstall.sh그런 다음 패키지를 설치하고 나중에 디렉토리를 비웁니다.설치가 성공적으로 완료된 경우에만.

에서 뭔가 누락된 경우 이 방식으로 실행되지 도 않는다는 $PATH점을 기억하세요 . 따라서 원격 스크립트 시작 부분에서 해당 소스를 소싱하거나 거기에서 적절한 PATH를 정의할 수 있습니다..bashrc.profile

관련 정보