我有一些使用ftp + .netrc的现有脚本。
我现在想切换到sftp,但它似乎不支持宏/ .netrc。
还有其他选择吗?
请帮忙。
答案 0 :(得分:19)
简单地说,您不能将.netrc
与sftp
,scp
或ssh
一起使用。这些产品是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
的私钥通过每一跳进行通信。我个人认为这种情况过于紧张,因此建议不要使用密码短语。
既然您可以在不输入任何密码或密码短语的情况下建立ssh
,sftp
和scp
个连接,那么您就可以自动完成剩下的工作了。
.netrc
宏转换为shell脚本或其他调用几个scp
命令的脚本,是首选方法。这类似于使用curl
或wget
自动执行所有ftp连接。 E.G:
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
如前所述使用sftp
,您可以使用expects
命令编写脚本,使用-b
选项使用batch file编写脚本,或者将命令汇总到{{1} }}。这与sftp
宏更相似,但没有替代方案1的优势。我将展示后者的一个例子:
.netrc
允许您存储连接参数(如密码),从而使用违反SSH标准的#!/bin/sh
echo "OK, starting now..."
sftp -b /dev/fd/0 remotehost <<EOF
cd pub
ascii
get filename.txt
bye
EOF
程序。例如,使用cyberduck和AppleScript,或FileZilla和队列。
有sftp
个文件you can use可为主机名提供更短的名称,设置转发参数,默认目录,默认用户名以及每个主机的特定身份。我也喜欢~/.ssh/config
的{{1}}选项,它将我的转移率限制为更合理的价格。
P.S。您认为有一个工具可以将-l
宏转换为(替代1个样式)shell脚本。但我一无所获。这是一个小小的利基商机吗?
答案 1 :(得分:2)
如果您可以在您的计算机上使用无密码身份验证(系统管理员可能禁止这种身份验证,但通常不允许),那么您可以方便地在shell脚本中使用scp而不是.netrc中的宏。但是如果你必须输入一个密码来登录远程机器,那么我会使用“here script”(其中带有EOF的位)来完成魔术。如果ftp脚本不时发生变化,您可以使用它来编写ftp脚本。
答案 2 :(得分:0)
尝试查看scp,因为您可以使用无密码登录(ssh密钥)来执行此操作。
你可能能够使用与SFTP相同的技术,我不确定。