在shell脚本中的while循环中运行expect命令

3
我有一个文本文件中列出了一些文件名,需要使用scp命令将每个文件传输到服务器。我正在从Read.sh读取文件名,并将每个文件名传递给transfer.sh脚本,但是scp没有在这个传输脚本中执行命令。如果我单独运行transfer.sh并传递参数,它可以正常工作。
List.txt
/home/kittu/file1.txt
/home/kittu/file2.txt
/home/kittu/file3.txt

Read.sh

#!/bin/bash
while read p; do
  echo $p
    ./transfer.sh "$p"
done <List.txt

transfer.sh

#!/usr/bin/expect -f

# get filename from command-line
set f [lindex $argv 0]

spawn scp "$f" user@192.168.4.151:/home/user/Desktop/ 
expect "password"
send "123\r"
interact

我只是运行了Read.sh:
>./Read.sh

输出:

/home/user/Desktop/file1.txt
spawn scp /home/mbox140/Desktop/test.sh mbox140@192.168.4.151:/home/mbox140/Desktop/videos/
user@192.168.4.151's password:

它没有执行下一条语句。请给我提供任何解决方案。


你尝试过运行独立的 transfer.sh 吗,它能正常工作吗?在 transfer.sh 中,交互命令应该会抛出错误,因为你试图与已关闭的进程通信(在这种情况下是 scp)。 - Ram
@Ram 是的,传输作为独立运行。 - Ramakrishna
1个回答

5
尝试以下脚本,改动是将Transfer.sh包装到bash.sh中。 等待密码的原因可能是你期望的模式不正确,请尝试使用"Password"而非"password",并在发送命令后期望终端模式,以便scp完成。
#!/bin/bash
while read p; do
echo $p
{
    /usr/bin/expect << EOF
    spawn scp $p user@192.168.4.151:/home/user/Desktop/
    expect "Password"
    send "123\r"
    expect "*#*"
EOF
}
done <List.txt

感谢您的评论,我在这里尝试了上面的代码,但是出现了语法错误和警告:第4行的文档以文件结尾(期望EOF),语法错误:意外的文件结尾。 - Ramakrishna
问题是由于复制粘贴错误导致的,您需要删除每行开头的额外空格,在脚本上尝试这个命令“sed -i 's/^ *//g' filename”,然后重新运行脚本,对于糟糕的格式化表示抱歉。 - Ram
嘿,我刚刚把echo $p给移除了,现在它可以工作了。感谢你的回答。 - Ramakrishna
在 while 循环中,是否有可能删除与 $p 匹配的行?因为我想一旦文件传输到服务器上,就从 List.txt 中删除文件名。 - Ramakrishna
你是指这一行代码吗:"spawn scp $p user@192.168.4.151:/home/user/Desktop/"? - Ram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接