簡體   English   中英

在bash數組中將變量傳遞給`expect`

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM