文章内容
2023/11/16 1:07:17,作 者: 黄兵
scp 使用密钥复制文件
最近需要使用 scp 在两台 Ubuntu 服务器之间复制文件,A 服务器是源服务器,B 服务器是目标服务器,可以通过 A 服务器密钥的方式登录 B 服务器,下面是操作步骤:
执行如下命令:
scp -i /path/to/private-key /var/CDN/* username@目标服务器IP:/home/ubuntu/
替换以下部分:
/path/to/private-key:你的私钥文件的路径。
username:目标服务器上的用户名。
目标服务器IP:目标服务器的IP地址。
这个命令将 /var/CDN 目录下的所有文件复制到目标服务器的 /home/ubuntu/ 目录中。
确保你有读取 /var/CDN 目录的权限和在目标服务器上写入 /home/ubuntu/ 目录的权限。
注意:如果目标服务器上的目标目录不存在,scp 会自动创建它。
如果我们在执行上面的命令时候,出现如下错误:
Load key "/root/1.pem": bad permissions
出现这个错误表明私钥文件的权限设置有问题。为了确保安全性,ssh 要求私钥文件的权限不能太宽松。
我们可以使用以下命令更改私钥文件的权限:
chmod 400 /root/1.pem
这会将私钥文件的权限设置为只有所有者(即我们当前用户)具有读权限,而其他人没有任何权限。然后再尝试使用 scp 命令。
更新完权限后,我们再次使用如上命令复制文件。
如果出现如下错误:
[email protected]: Permission denied (publickey).
这个错误表明在连接目标服务器时,服务器拒绝了你的公钥,可能是由于以下几个原因:
公钥未添加到目标服务器: 确保你的公钥已经被添加到目标服务器上的
~/.ssh/authorized_keys文件中。你可以手动将公钥内容添加到目标服务器上,或者使用ssh-copy-id命令:
ssh-copy-id -i /path/to/public-key username@目标服务器IP
这将把你的公钥添加到目标服务器上,确保你能够通过密钥进行身份验证。
目标服务器上的权限设置: 确保目标服务器上的
~/.ssh目录和~/.ssh/authorized_keys文件的权限设置正确。这两者的权限应该是:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
SSH 服务配置: 确保目标服务器上的 SSH 服务配置允许使用密钥进行身份验证。检查目标服务器上的 /etc/ssh/sshd_config 文件,确保以下行没有被注释掉:
PubkeyAuthentication yes
并确保 SSH 服务被重新加载:
sudo service ssh restart
如果我们需要将目录中的所有文件和文件夹都复制过去,需要增加 -r 参数,以递归方式复制整个目录及其内容。这样,scp 将能够复制目录中的所有文件和子目录。
例如,如果我们需要复制 /var/CDN 目录到目标服务器的 /home/ubuntu/ 目录,我们执行的 scp 命令应该类似于:
scp -i /path/to/private-key -r /var/CDN/* username@目标服务器IP:/home/ubuntu/
请注意,-r 参数指示 scp 递归地处理目录。如果你忘记了 -r 参数,并且尝试复制目录,scp 可能会报告错误或者只复制目录本身而不是其中的内容。
端口问题:
如果远程服务器并不是标准的 22 端口,上面的写法可能需要更改:
scp -i /path/to/private-key -P 2607 -r /var/CDN/* username@目标服务器IP:/home/ubuntu/
⚠️ 注意事项:
-
-P必须是 大写 P(小写-p在 scp 里是“保留权限”的意思)。
✅ 如果你需要定期同步或增量同步(推荐)
用 rsync 比 scp 更合适,例如:
rsync -avz -e "ssh -i /path/to/private-key -p 2607" /var/CDN/* username@目标服务器IP:/home/ubuntu/
这样只会同步有变化的文件,速度更快,也不会重复上传相同文件。
其它相关推荐:
2、Warning: the ECDSA host key for '[]:22' differs from the key for the IP address
评论列表