gpt4 book ai didi

expect 命令在 bash 脚本中不起作用

转载 作者:行者123 更新时间:2023-12-03 21:26:03 30 4
gpt4 key购买 nike

我有一个与期望相关的问题。

当我运行包含以下几行的 abc.sh 时

#!/usr/bin/expect
spawn scp /etc/httpd/conf/httpd.conf 192.168.0.12:/tmp
######################
expect {
-re "password:" {
exp_send "PASSWORD\r"
}
}
interact

它的工作正常

但是当我在运行脚本中使用类似的代码时它不起作用
#!/bin/bash
clear
while read -u3 LINE
do
code .........
code .......
code ........

REMOTE_COMMANDS1="scp -r -v $BASE_DIRECTORY/$USERNAME $D_IPADDRESS:/home/"

spawn $REMOTE_COMMANDS1
######################
expect {
-re "password:" {
exp_send "redhat\r"
}
}
interact


done 3< /opt/sitelist.txt

它给出了错误

./script.sh:第 62 行:意外标记附近的语法错误 }'
./script.sh: line 62:
}'

我认为这是因为我没有在脚本顶部包含 #!/usr/bin/expect 但是如果我使用它并执行我的脚本它不会做任何事情并在执行后在终端中显示所有代码。那么我们可以同时包含 #!/usr/bin/expect 和 #!/bin/bash 吗?

问候,
阿迪亚

最佳答案

当然,bash 不能解释expect 命令,就像bash 不能解释Java/Perl/Python 语法一样。有几种方法。

将 expect 脚本编写为一个单独的程序并从 bash 脚本中调用它:

#!/bin/bash
clear
while read -u3 LINE
do
#...
./expect_scp.exp "$BASE_DIR" "$D_IPADDRESS" "$USERNAME" "$PASSWORD"
done 3< /opt/sitelist.txt

expect_scp.exp
#!/usr/bin/expect

set base_dir [lindex $argv 0]
set remote_ip [lindex $argv 1]
set username [lindex $argv 2]
set password [lindex $argv 3]
# or
foreach {base_dir remote_ip username password} $argv {break}

spawn scp -rv $base_dir/$username $remote_ip:/home/
expect -re "password:"
exp_send -- "$password\r"
interact

您可以将 expect 脚本放在 bash 脚本中,并适当注意引用。幸运的是,单引号并不特别值得期待。
#!/bin/bash
clear
export BASE_DIR D_IPADDRESS USERNAME PASSWORD
while read -u3 LINE
do
#...
expect -c '
spawn scp -rv $env(BASE_DIR)/$env(USERNAME) $env(D_IPADDRESS):/home/
expect -re "password:"
exp_send -- "$env(PASSWORD)\r"
interact
'
done 3< /opt/sitelist.txt

关于expect 命令在 bash 脚本中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11050991/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com