用例
你想复制复制多个文件至远程的不同目录,一般使用scp。但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
怎样用一条命令复制多个文件至远程的不同目录?
方案一
最简单的方案是使用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,但需要先开通一个master connection指向服务器。
在~/.ssh/config中加入
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
如果你你启动一个与既存的连接的指向(user, port, machine)相同的ssh session,第二个session会被隧道化至第一个。建立第二个连接无需再次认证,并且速度很快。
方案四
你可以继续使用scp,但避免每次都输入用户名密码。
创建一个key pair,然后把私钥注入key agent ssh-add ~/.ssh/id_rsa
,这样你在每次连接时就无需键入任何内容了。
不过方案三和方案四只是折中方案。