18

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

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

还有其他选择吗?

请帮忙。

4

3 回答 3

23

简而言之,您不能使用.netrcwith或。这些产品是 OpenSSH 标准的一部分,其名称中包含关键字“secure”。以这种方式自动化登录并不是一种安全的做法,并且该标准禁止这种自动化(存储密码)。肯定有另一种选择,实际上是三个。sftpscpssh.netrc

授权

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

现在您可以在不输入任何密码或密码短语的情况下建立sshsftpscp连接,您已准备好自动执行其余操作。

备选方案 1,

如果您将.netrc宏转换为 shell 脚本或调用一些scp命令的其他脚本,则这是首选的替代方法。这类似于使用curl或自动执行所有 ftp 连接wget。例如:

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,或通过管道将命令输入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文件为主机名提供更短的名称、设置转发参数、默认目录、默认用户名和每个主机的特定身份。我也喜欢将我的传输速率限制在更合理的选项。-lscp

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

于 2009-09-03T16:30:40.260 回答
2

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

于 2011-07-08T23:21:54.863 回答
0

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

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

于 2009-09-01T06:35:50.570 回答