【问题标题】:using .netrc with sftp使用 .netrc 和 sftp
【发布时间】:2010-11-24 13:03:55
【问题描述】:

我有一些现有的脚本,其中正在使用 ftp + .netrc。

我现在想切换到 sftp,但它似乎不支持宏/.netrc。

还有其他选择吗?

请帮忙。

【问题讨论】:

    标签: ftp macros sftp


    【解决方案1】:

    尝试查看 scp,因为您可以使用无密码登录(ssh 密钥)来执行此操作。

    我不确定,您也许可以对 SFTP 使用相同的技术。

    【讨论】:

    • 谢谢马修。实际上,我的主要目的是使用 .netrc 中的宏。我可以将它与 SCP 一起使用吗?
    • scp 和 sftp 使用 same 无密码登录系统(SSH 密钥)。如果你可以让 scp 工作,那么你也可以让 sftp 工作。两者都不允许您存储密码。
    【解决方案2】:

    简单地说,您不能将.netrcsftpscpssh 一起使用。这些产品是 OpenSSH 标准的一部分,其名称中包含关键字“secure”。以.netrc 的方式自动登录不是一种安全的做法,标准禁止这种自动化(存储密码)。肯定有一个替代方案,实际上是三个。

    授权

    对于前两种选择中的任何一种,您都需要设置密钥并进行交换。在您从运行ssh-keygen 连接的机器上,出于您的目的,如果您不为密钥提供密码短语,它会更简单,尽管这是有风险的。您现在在.ssh/ 中有两个文件,一个id_rsa 和一个id_rsa.pub。其中id_rsa 必须保密或保密(因此是密码短语)。 pub 文件实际上是一行文本。这一行可以添加到接收主机一侧的~/.ssh/authorized_keys 文件中。您可以将密钥添加到文件manually;但也有ssh-copy-id 快捷命令可以做到这一点,同时也处理文件权限。授权密钥后,当您以适当的用户身份连接时,您应该能够从具有私钥的机器连接到具有授权公钥的机器。使用ssh -v 对其进行测试。如果您输入了密码,系统会提示您输入密码;如果你没有,你现在已经准备好自动化了。您可以使用ssh-agent 在会话之间保持私钥处于活动状态,同时只输入一次密码。如果您要进行多个ssh 跃点,则转发代理的选项将允许来自原始源框ssh-agent 的私钥通过每个跃点进行通信。就我个人而言,我觉得这太过分了,因此建议不要使用密码。

    现在您无需输入任何密码或密码即可建立sshsftpscp 连接,您可以自动完成其余操作。

    备选方案 1,

    如果您将.netrc 宏转换为shell 脚本或调用一些scp 命令的其他脚本,则

    是首选替代方案。这类似于使用 curlwget 自动执行所有 ftp 连接。例如:

    scp -qr $USER@$REMOTE_HOST:$PATH_FILE_OR_DIR $LOCAL_PATH_FILE_OR_DIR #download
    scp -qr $LOCAL_PATH_FILE_OR_DIR $USER@$REMOTE_HOST:$PATH_FILE_OR_DIR #upload
    scp -pqr $USER@$REMOTE_HOST:$PATH_FILE_OR_DIR $USER@$REMOTE_HOST2:$PATH_FILE_OR_DIR #mirror between separate hosts.
    ssh $USER@$REMOTE_HOST chmod 644 $PATH_FILE #set permissions
    

    备选方案 2,

    使用sftp,您可以使用expects 命令编写脚本,使用-b 选项使用batch file 或通过管道将命令输入sftp。这有点类似于 .netrc 宏,但与备选方案 1 相比没有优势。我将展示后者的示例:

    #!/bin/sh
    echo "OK, starting now..."
    sftp -b /dev/fd/0 remotehost <<EOF
    cd pub
    ascii
    get filename.txt
    bye
    EOF
    

    备选方案 3,

    使用sftp 程序,它允许您存储密码等连接参数,从而打破了 SSH 标准。例如使用cyberduck 和AppleScript,或者FileZilla 和一个队列。

    补充说明:

    有一个~/.ssh/config 文件you can use 为主机名提供更短的名称、设置转发参数、默认目录、默认用户名和每个主机的特定身份。我也喜欢scp-l 选项,它将我的传输速率限制在更合理的范围内。

    附:你会认为有一个工具可以将.netrc 宏转换为(另一种样式的)shell 脚本。但我什么也没找到。这是一个微小的利基商机吗?

    【讨论】:

    • 如果有人在没有密码的情况下窃取了他的 .ssh 私钥,就像他们窃取了他的 .netrc 文件一样糟糕,他们仍然可以将他们想要的任何内容上传到服务器。关键是只从您知道永远不会被盗/妥协/等的机器上进行自动上传。
    • 请学习ssh-copy-id,你已经浪费了太多的文字可以用一个命令来完成。
    • @ulidtko 我敢肯定,登陆这里的人会很感激带有链接和更多详细信息的答案。您还可以编辑此答案并在必要时插入 ssh-copy-id 的使用。它当然不是一个命令,但可以肯定的是,一旦你有了一个密钥,你就可以复制它,然后你就可以编写脚本来替换 netrc 脚本的其余部分。
    • ssh-copy-id 的烦人之处在于,每当您的主机或客户端发生变化(例如,您购买了一台新计算机)时,您的旧 ssh 密钥就会变得无用,您必须每隔几个月设置新密钥.
    • @Sridhar-Sarnobat 我也有一个不包含 ssh-copy-id 的发行版。不过,在设置新机器时,您应该能够保留身份文件的备份。你可能应该。
    【解决方案3】:

    如果您可以在您的机器上使用无密码身份验证(这可能会被您的系统管理员禁止,但通常不会),那么您可以方便地在 shell 脚本中使用 scp 而不是 .netrc 中的宏。但是,如果您必须输入密码才能登录远程机器,那么我会使用“这里脚本”(其中包含 EOF 的位)来发挥作用。如果 ftp 脚本不时更改,您可以使用 shell 脚本来编写它。

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 2022-07-11
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      • 2022-11-03
      • 2011-07-30
      • 2021-01-01
      • 1970-01-01
      相关资源
      最近更新 更多