我想知道使用scp复制文件系统上不同路径中存在的文件和文件夹的简单方法。 ssh目标服务器请求密码,我不能把它放在配置文件中。我知道scp没有我可以从脚本提供的密码参数,所以现在我必须逐个复制每个文件或目录,每次都写入我的密码。
答案 0 :(得分:11)
除了已经提到过的glob:
您可以使用{,}
在一个语句中定义备用路径/路径部分
例如:scp user@host:/{PATH1,PATH2} DESTINATION
答案 1 :(得分:4)
如果您可以使用单个glob模式表达要从远程系统复制的文件的所有名称,则可以在单个scp
命令中执行此操作。此用法仅支持本地系统上的所有文件的单个目标文件夹。例如:
scp 'RemoteHost:/tmp/[abc]*/*.tar.gz' .
复制远程系统中名为(something).tar.gz
的所有文件,这些文件位于/tmp
的子目录中,其名称以a
,b
或{开头} {1}}。单引号用于保护glob模式不被本地系统上的shell解释。
如果您无法将所有要复制的文件表达为单个glob模式,并且仍然希望使用单个命令(以及只需要一次通知密码的单个SSH连接)来完成复制,那么您可以之一:
c
不同的命令,例如scp
或sftp
或答案 2 :(得分:4)
创建密钥对,将公钥复制到服务器端。
ssh-keygen -t rsa
将文件〜/ .ssh / identity.pub中的内容追加到服务器端用户的文件〜/ .ssh / authorized_keys2。您不必再输入密码了。
但是,要小心!任何可以访问“本地帐户”的人都可以在没有密码的情况下“ssh”到服务器。
答案 3 :(得分:3)
来自this site:
SSHSOCKET=~/.ssh/myUsername@targetServerName
ssh -M -f -N -o ControlPath=$SSHSOCKET myUsername@targetServerName
scp -o ControlPath=$SSHSOCKET myUsername@targetServerName:remoteFile.txt ./
ssh -S $SSHSOCKET -O exit myUsername@targetServerName
比创建密钥对更直观,更安全,比创建压缩文件更快,并且对我有用!
答案 4 :(得分:2)
或者,如果您无法使用公钥身份验证,则可以将以下配置添加到SSH(~/.ssh/config
或相应的命令行参数):
ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
ControlPersist 2m
使用此配置,SSH连接将保持打开2分钟,因此您只需要在第一次输入密码。
This post详细了解此功能。