스크립트를 사용하여 일부 .deb 패키지 배포를 자동화하려고 합니다. sudo dpkg -i $myDeb.deb
SSH로 액세스할 수 있는 원격 컴퓨터 목록에서 실행하고 싶습니다 .
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
나는 당신이 탈출하는 따옴표 수준을 놓친 것 같아요. 이 높은 수준의 이스케이프에서는 인용이 필요한 모든 단계에 대해 간단한 스크립트를 만드는 것이 가장 좋습니다.
그렇지 않으면 이 수정된 버전을 사용해 볼 수 있습니다(그러나 저는 이 코딩 스타일을 권장하지 않습니다!).
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가지 수준 사이를 저글링할 필요가 없으면 자연스럽게 올바른 명령을 작성하게 됩니다.