[英]how to set bash variable in expect or return variable from expect to bash
[英]Passing variable to `expect` in bash array
我正在嘗試使用FOR循環遍歷IP地址(在bash數組中),登錄,運行腳本然后退出。 該數組稱為$ {INSTANCE_IPS [@]}。 但是,以下代碼無法正常工作,因為expect
似乎無法接受$ instance變量。
for instance in ${INSTANCE_IPS[@]}
do
echo $instance
/usr/bin/expect -c '
spawn ssh root@$instance;
expect "?assword: ";
send "<password>\r";
expect "# ";
send ". /usr/local/bin/bootstrap.sh\r";
expect "# ";
send "exit\r" '
done
但是, expect
抱怨:
can't read "instance": no such variable
while executing
"spawn ssh root@$instance"
有在位於計算器另一個問題在這里 ,使用環境變量來實現這一點,但是它不允許像我可以在一個陣列我通過不同的IP地址進行迭代。
任何幫助表示贊賞。
干杯
問題在於報價。 圍繞整個塊的單引號不允許Bash擴展變量( $instance
)。
您需要切換到雙引號。 但是然后,不允許在雙引號內使用雙引號(除非您將其轉義),因此最好使用帶有expect
字符串的單引號。
請嘗試:
for instance in ${INSTANCE_IPS[@]}
do
echo $instance
/usr/bin/expect -c "
spawn ssh root@$instance;
expect '?assword: ';
send '<password>\r';
expect '# ';
send '. /usr/local/bin/bootstrap.sh\r';
expect '# ';
send 'exit\r' "
done
for instance in ${INSTANCE_IPS[&]} ; do
echo $instance
/usr/bin/expect -c '
spawn ssh root@'$instance' "/usr/local/bin/bootstrap.sh"
expect "password:"
send "<password>\r"
expect eof'
done
在ssh手冊頁中:
If command is specified, it is executed on the remote host instead of a login shell.
指定命令意味着期望不必等待#
執行程序,然后等待另一個#
僅發送命令exit
。 相反,當您指定要使用ssh的命令時,它將執行該命令。 完成后退出; 然后ssh自動關閉連接。
或者,將值放在環境中,並期望在那里找到它
for instance in ${INSTANCE_IPS[&]} ; do
echo $instance
the_host=$instance /usr/bin/expect -c '
spawn ssh root@$env(the_host) ...
舊線程,也是其中的一個,但我已經在expect
工作了幾天。 對於遇到此問題的任何人,我相信我已經找到了一個可行的解決方案,可以解決在expect -c
腳本中傳遞bash
變量的問題:
#!/usr/bin/env bash
password="TopSecret"
read -d '' exp << EOF
set user "John Doe"
puts "\$user"
puts "$password"
EOF
expect -c "$exp"
請注意,轉義引號通常是一個引用的問題(如上面的@Roberto Reale所述), 在將bash-variable-evaluated字符串傳遞給expect -c
之前 ,我已經使用heredoc
EOF
方法解決了該問題。 與轉義引號相反, 所有本機的expect
變量都需要使用\\$
進行轉義 (我不是在這里解決所有第一手問題,我的下午時間安排很擠),但這應該可以大大簡化問題努力。 如果您對此概念證明有任何疑問,請告訴我。
tl; tr:一直在使用用戶身份驗證創建[ expect
]守護程序腳本,並且在我花了一整天時間創建單獨的bash / expect腳本,並分別使用不同的/dev/random
salt加密提示的密碼(通過bash) 后 ,才弄清楚了這一點迭代,將加密的密碼保存到臨時文件中,然后將salt傳遞給Expect腳本(強烈勸阻任何人不要通過ps
輕易地找到密碼,但不能阻止,因為可以替換期望腳本)。 現在,我應該能夠有效地將其保留在內存中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.