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がコマンドを一貫したコマンドとして処理できるようにする方法はわかりません。引用符 ""で囲み、引用符で囲まないと、$ExecuteSyncoid
bash変数は期待どおりに複数のパラメータとして扱われます。
この問題を解決する方法を知っているかどうかを知っている方は、本当にありがとうございます。
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