Bootstrap

scp免密传输文件总结

一、使用场景

linux服务器之间需要传输文件时。

最近在搞服务器迁移,之前有一个前端服务器,一个后端服务器,它俩之间有个共享磁盘;在前端服务器发版前端项目时,会放到共享磁盘上,后端服务器会通过这个共享磁盘路径直接使用前端发版的某些文件。

现在迁移后,也有一个前端服务器,一个后端服务器,但是没有共享磁盘了;导致后端项目无法通过共享磁盘路径直接使用前端发版的文件,进一步导致后端项目报错。

因此就想搞个脚本,发版前端项目时执行下,把后端需要的文件直接传到后端服务器指定路径中。

(其实这个逻辑就很奇怪,为啥后端项目要直接通过磁盘路径用前端文件?要用的话直接算后端项目不行吗?但是没办法,现有代码就是这么写的…)

二、scp传输文件命令

现在假设前端项目在10.123.123.78;(简称78)
后端项目在10.123.123.79。(简称79)

1.登录前端服务器,使用scp命令把文件传到后端服务器

scp -v -r /home/useradmin/cdn [email protected]:/home/useradmin/cdn

说明:
-v是debug模式,可以看到命令执行的详细情况;也可以使用-vvv查看更详细的情况。
useradmin是用户名,默认路径在home下。
这条命令把78上的cdn文件夹及其中内容传到了79的指定路径下。(指定路径也是cdn)

2.登录后端服务器,使用scp命令把文件从前端服务器拉过来

scp -v -r [email protected]:/home/useradmin/cdn /home/useradmin/cdn

说明:
-v是debug模式,可以看到命令执行的详细情况;也可以使用-vvv查看更详细的情况。
useradmin是用户名,默认路径在home下。
这条命令把78上的cdn文件夹及其中内容传到了79的指定路径下。(指定路径也是cdn)

3.登录其它服务器,使用scp命令把78上的文件传到79上

scp -v -r [email protected]:/home/useradmin/cdn [email protected]:/home/useradmin/cdn

说明:
-v是debug模式,可以看到命令执行的详细情况;也可以使用-vvv查看更详细的情况。
useradmin是用户名,默认路径在home下。
这条命令把78上的cdn文件夹及其中内容传到了79的指定路径下。(指定路径也是cdn)

三、scp免密传输方法

这部分是重点,本人也踩了不少坑。

主要的坑就是文件权限不标准,导致配置了rsa密钥后也不起作用,执行scp命令还得输密码;
最后配置对文件权限就可以了。

现在总结如下:

1.使用sshpass命令,但是需要安装,否则会提示command not found.

sshpass -p s123456s scp -v -r /home/useradmin/cdn [email protected]:/home/useradmin/cdn

说明:
其中,s123456s是服务器79的useradmin用户的密码。
由于目标服务器没有外网,不太好装sshpass命令,因此这个方法本人没有测试。

2.配置免密登录(rsa)

(1)登录后端服务器79,执行命令,生成无密码的密钥对。

ssh-keygen -t rsa

按回车继续即可,会在/home/useradmin/.ssh下生成2个文件。

(2)在79上执行命令,将密钥文件传给前端服务器78

scp -v -r /home/useradmin/.ssh/id_rsa.pub [email protected]:/home/useradmin/

这个命令从79把id_rsa.pub文件传到了78服务器的/home/useradmin/目录下;这里需要先输入一次78的密码。

(3)登录前端服务器78,执行命令,将公钥添加到本地认证文件中。
如果提示文件不存在,可以先执行’ssh-keygen -t rsa’命令,会自动创建.ssh文件夹,然后执行下面的命令就不会报错了。

cat /home/useradmin/id_rsa.pub >> /home/useradmin/.ssh/authorized_keys

(4)重要,执行以下命令,设置78的路径权限与文件权限。

chmod 700  /home/useradmin
chmod 700 /home/useradmin/.ssh
chmod 600 /home/useradmin/.ssh/authorized_keys

说明:
以上权限不能图省事,设置为777;
用户路径权限必须是700;
.ssh路径权限必须是700;
authorized_keys的权限必须是600;

如果权限错误,则会导致配置免密登录无效、执行scp命令还是要求输入密码的情况。

(5)需要按照上方的步骤,反过来配置下这两台服务器。

(6)现在从前端服务器78可以免密访问后端服务器79了,可以登录78,执行scp命令测试,如果不用输入密码,即是配置成功。

scp -v -r /home/useradmin/cdn [email protected]:/home/useradmin/cdn

如果想从79免密访问78,可以登录79,执行scp命令测试。

scp -v -r [email protected]:/home/useradmin/cdn /home/useradmin/cdn

------------------

其它笔记:

1.没有生成known_hosts文件,使用ssh命令出现
Warning: Permanently added '10.123.123.79' (ECDSA) to the list of known hosts.

解决方法:执行命令

sudo vi /etc/ssh/ssh_config

把下方两行注释:

#StrictHostKeyChecking no
#UserKnownHostsFile /dev/null

然后执行ssh命令,例如ssh 10.123.123.79后,输入yes、输入密码链接成功后,就可以看到/home/useradmin/.ssh目录下生成了known_hosts文件。

2.删除文件夹及其子文件命令:

sudo rm -rf ./cdn

可以删除当前目录下的cdn文件夹及其中的子文件。

;