BASH
나는 두 개의 목록을 반복하고 그 목록에서 명령을 생성하는 스크립트를 만드는 데 시간을 보냈습니다 .
마지막으로 명령을 실행하고 ZFS 서버와 ZFS 백업 서버를 동기화해야 합니다.
유일한 장점은 BASH
명령이 비밀번호를 요청할 때 실제로 비밀번호를 삽입할 방법이 없다는 것입니다.
내가 이해하는 한 이것은 를 통해 수행될 수 있습니다 expect
.
명령은 $ExecuteSyncoid
다음과 같이 저장됩니다.
/usr/sbin/syncoid <UserName>@<IP>:Storage/WallaBag Storage/Docker/WallaBag --compress none --sshcipher [email protected] --sshport <PortNumber> --sshkey </dest/to/keyfile> --no-privilege-elevation
비밀번호는 다음 위치에 저장됩니다.$PWD
이제 BASH에서 이를 수행해야 합니다. 이전에 시도한 적이 없는 모든 코드를 expect
다시 만들 기분이 아니기 때문입니다 .expect/tcl
이 expect
부분은
Enter passphrase for key '<nameOfKey>'
지금은 이해가 안 되지만 tcl/expect
지금까지 시도해 보았지만 한 번도 제대로 작동하지 않습니다.
expect -c 'expect "Enter" { spawn $ExecuteCommand; send -- "$PWD\r"; interact }'
expect -c 'spawn $ExecuteSyncoid; expect "Enter"; send -- "$PWD\r"; interact'
syncoid command/password
/usr/bin/expect - <<EOF
spawn $ExecuteSyncoid
expect "Enter"
send -- "$PWD\r"
EOF
/usr/bin/expect <<EOD
spawn $ExecuteSyncoid
expect "Enter passphrase for key"
send -- "$PWD\r"
interact
EOD
/usr/bin/expect -c 'expect "Enter" { spawn $ExecuteSyncoid; send -- "$PWD\r" }'
별도의 스크립트도 만들어 보았습니다.
expect -f ./SynCoid-IterateThroughDataSets.exp $ExecuteSyncoid $PWD
코드 사용
#!/usr/bin/expect -f
set ExecuteSyncoid [lindex $argv 0];
set PWD [lindex $argv 1];
spawn $ExecuteSyncoid
expect "Enter"
send "\$PWD\r"
$ExecuteSyncoid
하지만 안타깝게도 Expect가 명령을 하나의 일관된 명령으로 처리하도록 만드는 방법을 알 수 없습니다 . 따옴표 ""로 묶고 따옴표로 묶지 않으면 $ExecuteSyncoid
bash 변수는 예상대로 여러 매개변수로 처리됩니다.
이 문제를 해결하는 방법을 아시거나 어떻게 해야 하는지 아시는 분 계시면 정말 감사하겠습니다.
expect
명령이 실행되는 동안 명령의 출력을 볼 수 있다면 좋을 것입니다.$ExecuteSyncoid
감사합니다, 다옐
답변1
모든 변형을 검토하지는 않습니다. 그러나 쉘 변수는 작은따옴표 내에서 확장되지 않습니다.
마지막 변형을 살펴보십시오.
쉘 부분
ExecuteSyncoid="/usr/sbin/syncoid <UserName>@<IP>:Storage/WallaBag Storage/Docker/WallaBag --compress none --sshcipher [email protected] --sshport <PortNumber> --sshkey </dest/to/keyfile> --no-privilege-elevation"
PassWord="abc123" # Don't use PWD!
expect -f ./SynCoid-IterateThroughDataSets.exp $ExecuteSyncoid $PassWord
변수는 참조되지 않기 때문에분사:스크립트에 2개가 아닌 13개의 매개변수가 표시될 것으로 예상합니다.
항상 변수를 인용하세요.
expect -f ./SynCoid-IterateThroughDataSets.exp "$ExecuteSyncoid" "$PassWord"
부분이 기대됩니다
#!/usr/bin/expect -f
set ExecuteSyncoid [lindex $argv 0];
set PWD [lindex $argv 1]; # this has nothing to do with the shell's PWD variable
spawn $ExecuteSyncoid
expect "Enter"
send "\$PWD\r"
이제 쉘 변수가 인용되었으므로 기대 변수는 ExecuteSyncoid
공백을 포함하는 단어입니다.
이 spawn
명령에는 단어 확장이 필요하므로 Tcl을 사용하겠습니다.인수 확장통사론:
spawn {*}$ExecuteSyncoid
전송할 때 예상되는 PWD 변수를 이스케이프하고 싶지 않습니다. 첫 번째 백슬래시를 제거하세요.
send "$PWD\r"
예상에서 다른 작업을 수행하지 않는 한, 비밀번호를 보낸 후 예상 스크립트가 종료되어 syncoid 프로세스가 종료됩니다. Expect 스크립트의 마지막 줄은 다음 중 하나여야 합니다.
- 인간인 당신이 시노이드와 상호작용해야 한다면
interact
- 상호작용이 필요하지 않은 경우
expect eof