使用scp从不同路径复制多个文件的智能方法

时间:2012-01-09 09:21:59

标签: ssh scp

我想知道使用scp复制文件系统上不同路径中存在的文件和文件夹的简单方法。 ssh目标服务器请求密码,我不能把它放在配置文件中。我知道scp没有我可以从脚本提供的密码参数,所以现在我必须逐个复制每个文件或目录,每次都写入我的密码。

5 个答案:

答案 0 :(得分:11)

除了已经提到过的glob:

您可以使用{,}在一个语句中定义备用路径/路径部分

例如:scp user@host:/{PATH1,PATH2} DESTINATION

答案 1 :(得分:4)

如果您可以使用单个glob模式表达要从远程系统复制的文件的所有名称,则可以在单个scp命令中执行此操作。此用法仅支持本地系统上的所有文件的单个目标文件夹。例如:

scp 'RemoteHost:/tmp/[abc]*/*.tar.gz' .

复制远程系统中名为(something).tar.gz的所有文件,这些文件位于/tmp的子目录中,其名称以ab或{开头} {1}}。单引号用于保护glob模式不被本地系统上的shell解释。

如果您无法将所有要复制的文件表达为单个glob模式,并且仍然希望使用单个命令(以及只需要一次通知密码的单个SSH连接)来完成复制,那么您可以之一:

  • 使用与c不同的命令,例如scpsftp
  • 打开与远程主机的SSH主连接,并运行多个scp命令作为该主服务器的从属服务器。奴隶将搭载主连接,它始终保持打开状态,不会要求您输入密码。阅读master& ssh联机帮助页中的从属连接。

答案 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详细了解此功能。