Linux下几种不同服务器间使用scp远程拷贝避免手动输入密码的解决方案
前言
scp是 secure copy的缩写,scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令。linux的scp命令可以在linux服务器之间复制文件和目录。
使用scp需要从服务上已经安装openssh-server。(A -> B或者A<-B,这里都把A称作主服务器,B称做从服务器)
Ubuntu:
查看是否安装:dpkg -l | grep openssh-server
安 装:sudo apt-get install openssh-server
CentOS:
查看是否安装:rpm -qa | grep openssh-server
安 装:yum install openssh-server
下面介绍几种避免手动输入密码的解决方案。
方案一:服务器间建立SSH信任关系
1、在主服务器上执行ssh-keygen -t rsa,一直回车就好,不要输入密码,执行完成会在~/.ssh目录下生成id_rsa私钥和id_rsa.pub公钥文件,如下图:
2、执行scp -r ~/.ssh/id_rsa.pub user@ip:~/.ssh/tmp,输入从服务器用户密码后将主服务器的公钥拷贝到从服务;
3、从服务器上执行ls ~/.ssh/authorized_keys判断文件是否存在,不存在则执行touch ~/.ssh/authorized_keys创建,然后执行cat ~/.ssh/tmp >> ~/.ssh/authorized_keys将主服务器公钥追加到从服务器的authorized_keys里面
现在可以在直接在主服务器上拷贝文件到从服务器(scp -r xxx user@ip:dir/xxx)或者从从服务器上拷贝文件到主服务器上(scp -r user@ip:dir/xxx xxx),而不需要密码了。
方案二:使用sshpass工具来自动输入密码
有时候从服务器上的authorized_keys我们是没办法修改的,这时候就没办法使用方案一来使另个服务器之间建立信任关系了。这种情况下我们可以选择使用sshpass工具来完成ssh连接时密码的自动输入。
首先我们需要在主服务上安装sshpass工具
Ubuntu:
查看是否安装:dpkg -l | grep sshpass
安 装:sudo apt-get install sshpass
CentOS:
查看是否安装:rpm -qa | grep sshpass
安 装:yum install sshpass
安装完成后,就可以使用sshpass -p pwd scp xxx user@ip:xxx直接拷贝文件了。
方案三:使用expect脚本来自动输入密码
expect用于自动化地执行linux环境下的命令行交互任务,例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具,定义在scp过程中可能遇到的情况,然后编写相应的处理语句,就可以自动地完成scp操作了。
首先安装expect脚本:
Ubuntu:
查看是否安装:dpkg -l | grep expect
安 装:sudo apt-get install tcl tk expect
CentOS:
查看是否安装:rpm -qa | grep expect
安 装:yum install tcl tk expect
安装完脚本后touch expect_scp创建文件后写入下面内容
#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set src_file [lindex $argv 3]
set dest_file [lindex $argv 4]
spawn scp $src_file $username@$host:$dest_file
expect {
"(yes/no)?"
{
send "yes\n"
expect "*assword:" { send "$password\n"}
}
"*assword:"
{
send "$password\n"
}
}
expect "100%"
expect eof
保存后,chmod +x expect_scp赋予可执行权限。然后执行命令”./expect_scp ip user pwd 主服务文件 从服务器文件” 即可直接复制。
注:关于expect部分详细请参考《shell结合expect写的批量scp脚本工具》
另外对于IP地址是第一次使用的情况会询问,需要手动点击回车,可通过添加参数使用命令scp -o “StrictHostKeyChecking no” xxx xxx解决。