【问题标题】:how to prevent scp/ssh from trying to read standard input如何防止 scp/ssh 尝试读取标准输入
【发布时间】:2020-09-27 03:23:20
【问题描述】:

我正在使用授权密钥将文件从一台服务器传递到另一台服务器。 但是,如果事件密钥不再有效,则会不断要求脚本输入密码。

我试过了

scp ${user}@$host}:/tmp ./file1 </dev/null

但我仍然得到提示。 唯一可行的情况是我像这样不按计划运行它:

echo "scp ${user}@$host}:/tmp ./file1" | at now

在这种情况下,如果密钥不再有效,它将正确出错。

但是如何创建一个空白输入流,如果脚本以交互方式运行则不会提示用户?

@大卫:

echo "" | scp ${user}@${host}:/tmp ./file1 </dev/null 

没有帮助,同样的响应,所以它可能需要一个 stty 命令来将 tty 输入归零,我现在猜,根据 Kenster 的说明。

【问题讨论】:

  • 密钥认证失败时提示,说明服务器开启了密码认证。除非您可以更改服务器配置,否则您只需要处理它。现在您还可以选择提供客户端 ~/.ssh/config,您应该可以在其中设置 PasswordAuthentication no 并将其作为身份验证方法删除(注意:我没有尝试过,但我不明白为什么不会工作)。如果没有,你会遇到类似echo "" | scp ${user}@$host}:/tmp ./file1 &lt;/dev/null 这样的东西,如果失败,它会在stdin 上提供空字符串。
  • 另请注意,这是一个可能被解释为题外话的问题,因为它不是真正的“编程”相关,而是“如何在密钥验证失败的情况下使用 scp ...”,因此您可能希望将问题迁移到 StackExchange 站点 Super UserUnix & Linux
  • ssh(以及 scp 和 sftp)实际上是从 /dev/tty 而非标准输入读取密码和密码。

标签: shell unix ksh scp


【解决方案1】:

但是如何创建一个空白输入流,如果脚本以交互方式运行则不会提示用户?

而不是禁用密码身份验证。

scp -o BatchMode=yes -o PasswordAuthentication=no -o PubkeyAuthentication=yes ... 

【讨论】:

    【解决方案2】:

    这可能也有效

    scp ${user}@${host}:/tmp ./file1 /dev/tty0 > /dev/null
    

    【讨论】:

      猜你喜欢
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      相关资源
      最近更新 更多