【问题标题】:scp in Expect script works for few files but not for many filesExpect 脚本中的 scp 适用于少数文件,但不适用于很多文件
【发布时间】:2020-08-02 23:50:18
【问题描述】:

我编写了一个 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 -vv看看日志里有没有东西吗?
  • 我关注了你的评论,但是日志记录太长,这里就不写了。
  • >>> debug2: channel 0: rcvd ext data 36 Sink: C0644 0 result_analysis.txt debug2: channel 0: 将36写入efd 6 result_analysis.txt 100% 0 0.0KB/s 00:00 发送文件模式:C0644 0 result_analysis2.txt
  • 你说 scp 没有打印任何错误。你怎么知道它失败了?
  • 如果您使用 ssh 密钥,则根本不需要期望。 ssh-keygenssh-copy-id

标签: remote-access expect file-transfer scp


【解决方案1】:

前段时间我不得不这样做,但是对于多个服务器,其列表会随着夜晚的变化而变化。我发现有时 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}
                                        }
                                }
                        }                
                }

【讨论】:

  • 这么多反斜杠。像问题中那样坚持使用heredoc。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多