Expect 脚本中的 scp 适用于少数文件,但不适用于许多文件

scp in Expect script works for few files but not for many files

我写了一个 bash 代码来将文件从我的远程笔记本电脑发送到服务器计算机。我使用 'scp' 命令并将其写在 bash 脚本上,以绕过每次 运行 时输入密码。

expect <<EOF
spawn scp -P 1111 -o StrictHostKeyChecking=no -r /Users/Desktop/sync_mac user@192.111.111.101:/home/folder
expect "password:"
        send "11111\r"
expect eof
EOF

但是,问题是当我在终端上运行 bash 脚本时,它似乎工作正常但突然发送文件失败,没有任何警告迹象。(特别是对于发送文件数量多或文件体积大,数量少体积小的情况下没问题)

感谢您的帮助

前阵子我不得不这样做,但是对于多个服务器,其列表会每晚发生变化。我发现有时 scp 会要求首先将主机添加到您的已知主机列表中,或者我必须为其编写代码处理的其他消息。这可能会被埋在你的脚本中。

这是最终有效的摘录,如果有帮助的话:

        expect -c "
                spawn ssh-copy-id -i /x/home/$USER/.ssh/id_rsa.pub  $USER@$HOST
                expect {
                        \"password:\" {
                                send \"$PASS\n\"
                                expect {
                                        \"expecting.\" { }
                                        timeout {exit 1}
                                        \"again.\" {exit 1}
                                }
                        }
                        \"yes/no)?\" { 
                                send \"yes\n\" 
                                expect \"password:\" {
                                        send \"$PASS\n\"
                                        expect {
                                                \"expecting.\" { }
                                                timeout {exit 1}
                                                \"again.\" {exit 1}
                                        }
                                }
                        }                
                }

expect 的默认超时为 10 秒,因此 expect eof 最多等待 10 秒,这对于您提到的许多文件来说可能不够。

要修复,您可以在 expect eof 之前 set timeout -1 或直接 expect -timeout -1 eof