Bash에서 예상을 사용하여 비밀번호 요청과 함께 명령 실행

Bash에서 예상을 사용하여 비밀번호 요청과 함께 명령 실행

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가 명령을 하나의 일관된 명령으로 처리하도록 만드는 방법을 알 수 없습니다 . 따옴표 ""로 묶고 따옴표로 묶지 않으면 $ExecuteSyncoidbash 변수는 예상대로 여러 매개변수로 처리됩니다.


이 문제를 해결하는 방법을 아시거나 어떻게 해야 하는지 아시는 분 계시면 정말 감사하겠습니다.

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
    

관련 정보