scp在Linux主机之间复制文件/目录不用输入密码

最近我们的信息系统需要进行一个认证,原来我们数据只是备份在本机,认证要求备份到异地,所以就想着用脚本实现,把本机文件自动传输到异地服务器,我之前使用过主机之间复制文件命令scp,但是scp需要手动输入密码,如何解决这个问题,有两种方式,一种是把本机用户ssh公钥文件复制到远程主机用户的~/.ssh/authorized_keys文件中,第二种是使用expect,自动帮你输入密码

------------第1种-------------------------------------------------------------------------------------------------------------

把你的本地主机用户的ssh公匙文件复制到远程主机用户的~/.ssh/authorized_keys文件中,假设本地主机linux(10.1.1.1),远程主机linux(10.1.1.2)
一,在linux100主机里的用户
运行 
#ssh-keygen -t rsa
结果如下
Generating public/private rsa key pair.
Enter file in which to save the key (/home/.username/ssh/id_rsa):#回车
Enter passphrase (empty for no passphrase):#回车
Enter same passphrase again:#回车
Your identification has been saved in /home/.username /.ssh/id_rsa.
Your public key has been saved in /home/.username /.ssh/id_rsa.pub.
The key fingerprint is:
38:25:c1:4d:5d:d3:89:bb:46:67:bf:52:af:c3:17:0c username@localhost
Generating RSA keys:
Key generation complete.
会在用户目录~/.ssh/产生两个文件,id_rsa,id_rsa.pub
二,把linux(10.1.1.1)主机上的id_rsa.pub文件拷贝到linux(10.1.1.2)主机的root用户主目录下的.ssh目录下,并且改名为authorized_keys
即:
/root/.ssh/authorized_keys
这样在linux100主机上使用scp命令复制文件到linux(10.1.1.2)上将不提示输入密码了,直接复制了。反之亦然!
三,复制文件或目录命令:
复制文件:
(1)将本地文件拷贝到远程
scp 文件名 --user@10.1.1.2:远程路径
(2)从远程将文件拷回本地
scp --user@10.1.1.2:文件名 本地路径
复制目录:
(1)将本地目录拷贝到远程
scp -r 目录名 --user@10.1.1.2:远程路径
(2)从远程将目录拷回本地
scp -r --user@10.1.1.2:目录名 本地路径。

------------第2种-------------------------------------------------------------------------------------------------------------

上述方式 ,如果多台机器向同一台传文件,就不知道咋整了,还没研究,且看下面expect安装及用法

expect是在Tcl的基础上创建的,可以用来做一些Linux下无法做到交互的命令操作,可用于远程管理服务器。

1.yum安装
yum -y install expect
2.手动安装
因为我的主机没法连外网,无法yum安装,所以只能手动安装,步骤如下:
(1)下载tcl和expect的包,放到linux指定位置上
https://download.csdn.net/download/seelye/20903138
下载后可以得到expect-5.43.0.tar和tcl8.4.11-src.tar
(2)将下载好的压缩包,解压到指定目录下,我这里解压到当前目录
(3)安装配置tcl
cd tcl8.4.11/unix
./configure --prefix=/home/app/tcl --enable-shared
make
make install
#注意
#安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子录generic中。
cp ./tclUnixPort.h ../generic/
(4)安装配置expect
cd expect5.43
./configure --prefix=/home/app/expect --with-tcl=/home/app/tcl/lib --with-tclinclude=../tcl8.4.11/generic
make
make install
ln -s /home/app/expect/bin/expect /usr/bin/expect
最后这一步因为我没有权限无法创建连接,所以没有操作
(5)使用
因为没有建立软连接,所有使用的时候直接指向的是expect的安装路径
#!/usr/bin/expect
set timeout 10
spawn scp /oradata/backup/whs/whs_20210807.dmp.bz2  root@192.168.123.76:/home/oracle_bak/whs
expect "password"
send "rapoo$%^2014\r"
expect eof

题外话:我在oracle用户下面创建了一个定时任务,执行自动备份,自动传输文件,最后发现执行结果跟预想的不一样,此时一般需要检查oracle用户的环境变量,不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
#!/bin/sh
source /etc/profile
source ~/.bash_profile
export ORACLE_HOME="/oradata/app/oracle/oracle/product/10/2/0/db_1"
3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /home/oracle/auto_backup.sh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值