通过一个命令将 scp 文件从本地多个目录复制到远程多个目录

通过一个命令将 scp 文件从本地多个目录复制到远程多个目录

我需要将一些文件从多个本地目录复制到多个远程目录。

命令:

scp -v /file/source1/* username@host_server:/file/destination1
scp -v /file/source2/* username@host_server:/file/destination2
scp -v /file/source3/* username@host_server:/file/destination3

它一次又一次要求输入密码。

命令:

scp file1 file2 ... fileN user@host:/destination/directory/

将把所有文件放入一个目标目录中。

但我的所有文件的目的地都不同。

答案1

一个命令中不能有多个目的地scp。如果您想建立单个 SSH 连接,则需要使用其他工具。

最简单的解决方案是将远程文件系统挂载到SSHFS然后使用cp命令。这需要 SFTP 访问。

mkdir host_server
sshfs username@host_server:/file host_server
cp /file/source1/* host_server/destination1
cp /file/source2/* host_server/destination2
cp /file/source3/* host_server/destination3
fusermount -u host_server
rmdir host_server

另一种解决方案是首先在本地组织文件,然后复制层次结构。这需要rsync。

mkdir destination1 destination2 destination3
ln -s /file/source1/* destination1
ln -s /file/source2/* destination2
ln -s /file/source3/* destination3
rsync -a --copy-unsafe-links destination1 destination2 destination3 username@host_server:/file
rm -r destination1 destination2 destination3

另一个解决方案是继续使用scp,但首先打开到服务器的主连接。这在中进行了解释使用已建立的 SSH 通道

或者,只需忍耐并建立三个scp连接。但不要使用您的密码登录;相反,创建一个密钥对并将私钥加载到您的密钥代理 ( ssh-add ~/.ssh/id_rsa) 中,然后您无需在每个连接上键入任何内容。

答案2

  1. 为了避免重复的密码提示,请使用基于密钥的身份验证而不是基于密码的身份验证。

    ssh-keygen例如,在本地计算机上运行,​​然后ssh-copy-id user@remotehost为每个远程主机运行。这将是您最后一次需要在该计算机上ssh输入密码。scp

    在你的密钥上使用一个好的密码并运行ssh-agent或类似的。这样,您只需在第一次在登录会话中使用私钥时输入私钥的密码。

  2. pdcp从包装中取出使用pdsh。例如:

    pdcp -w host1,host2,host3 /path/to/source/file /path/on/destination/

    或者如果您的主机名与某个模式匹配:

    pdcp -w host[1-3] /path/to/source/file /path/on/destination/

    您不能有多个目的地,但可以有多个源。例如pdcp -w h1,h2,h3 file1 file2 file3 /remote-path/将复制到每台机器上的 /remote-path/ 目录(任何缺少该目录的目标机器将输出错误消息)

    如果需要将多个源文件复制到多个主机上的不同目录,可以使用 for 循环包装器。您可以对普通旧设备执行相同的操作scp,但是您需要一个用于主机的外循环以及一个用于执行scps 的内循环。此外,pdcp并行复制到多台机器,而不是一次复制一台。

    使用pdsh( 和pdcp),您可以为机器组配置任意名称,例如,所有计算节点都在组中compute-nodes,所有 Web 服务器在web组中,数据库服务器在组中db,所有主机在组中等all

    然后你可以做这样的事情:

    pdsh -g web 'uname -a ; uptime' 或者 pdcp -g web,db /etc/motd /etc/

答案3

SCP用途SSH用于数据传输,并使用相同的身份验证并提供相同的安全性SSH。不像远程控制协议,SCP如果需要进行身份验证,将要求输入密码或密码短语。所以你可以:
1. 解决SSH通过编辑远程来通过公钥进行连接,sshd_config例如

# Should we allow Identity (SSH version 1) authentication?
RSAAuthentication yes       
# Should we allow Pubkey (SSH version 2) authentication?
PubkeyAuthentication yes
# Where do we look for authorized public keys?
# If it doesn't start with a slash, then it is
# relative to the user's home directory
AuthorizedKeysFile .ssh/authorized_keys

生成密钥对

localhost$ ssh-keygen -t rsa

并将其发送到远程主机

localhost$ scp ~/.ssh/id_rsa.pub [email protected]
localhost$ ssh [email protected]
remote.server.host$ [ -d ~/.ssh ] || (mkdir ~/.ssh; chmod 700 ~/.ssh)
remote.server.host$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
remote.server.host$ chmod 600 ~/.ssh/authorized_keys

或者
2.[不安全]设置无密码远程主机用户

3. 使用脚本expect

#!/usr/bin/expect
stty -echo
send_user -- "Enter Password: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set PASS $expect_out(1,string)
spawn scp -v /file/source1/* username@host_server:/file/destination1
expect "assword:"
send $PASS"\r"
expect eof

答案4

通过对命令进行非常小的修改,就可以实现如下所示。

假设您source1, source2的“文件”文件夹中有 .. 文件夹,您可以按如下方式运行以将所有这些文件夹复制source1, source2 ..到目标服务器中。

scp -r /source/file username@host_server:/file/destination1

这将创建文件夹并将其内容复制到目标服务器上source1, source2目标路径中的相应文件夹中 。/file/destination1

相关内容