Bashで予測を使用してパスワード要求でコマンドを実行する

Bashで予測を使用してパスワード要求でコマンドを実行する

BASH私は2つのリストを繰り返し、そのリストからコマンドを生成するスクリプトを作成するのに時間を費やしました。

最後に、コマンドを実行して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

ありがとう、Dayel

答え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
    

関連情報