我需要将一些文件从多个本地目录复制到多个远程目录。
命令:
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
为了避免重复的密码提示,请使用基于密钥的身份验证而不是基于密码的身份验证。
ssh-keygen
例如,在本地计算机上运行,然后ssh-copy-id user@remotehost
为每个远程主机运行。这将是您最后一次需要在该计算机上ssh
输入密码。scp
在你的密钥上使用一个好的密码并运行
ssh-agent
或类似的。这样,您只需在第一次在登录会话中使用私钥时输入私钥的密码。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
,但是您需要一个用于主机的外循环以及一个用于执行scp
s 的内循环。此外,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