[转]Linux:如何使得执行scp命令时不需要输入用户密码

转自: http://blog.tianya.cn/blogger/post_read.asp?BlogID=3668847&PostID=32922633
由于很多部门需要从公司服务器后台的数据库中去拉报表,
  
    且因为每个部门对数据库表的需求、字段的需求不一样,
  
    例如:
  
    客服可能需要用户表、仓库产品表。
  
    而产品部门却需要产品列表等。
  
    这样会导致数据库反复的去检索查询数据库中的数据,并且在前段用户同时访问的情况下,这样就无形的导致
  
    数据库系统以及操作系统的压力过大。
  
    为解决这个问题,所以准备将数据库整个目录定时备份到另一台机器上,然后使得需要拉报表的人员从这台backup的机器上去拉报表。
  
    ========================================================================================================
  
    问题出现:
  
    但是这时候写脚本,问题就出现,因为我要从这个“执行脚本”的机器上面备份到另一台“接收数据”的机器上去。
  
    这时候就想到了SCP命令。
  
    但是我们知道在使用SCP命令的时候,其中因为安全机制的问题会跳出输入密码的部分,而且如果两台机器如果是第一次互相通信,
  
    那么还会出现如下的需要确认的信息:
  
    [root@test2 idaphne]# scp -rv 1.txt [email protected]:/root/scripts/
  
    Executing: program /usr/bin/ssh host 192.168.2.70, user roo, command scp -v -r -t /root/scripts/
  
    OpenSSH_4.3p2, OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
  
    debug1: Reading configuration data /etc/ssh/ssh_config
  
    debug1: Applying options for *
  
    debug1: Connecting to 192.168.2.70 [192.168.2.70] port 22.
  
    debug1: Connection established.
  
    debug1: permanently_set_uid: 0/0
  
    debug1: identity file /root/.ssh/identity type -1
  
    debug1: identity file /root/.ssh/id_rsa type -1
  
    debug1: identity file /root/.ssh/id_dsa type -1
  
    debug1: loaded 3 keys
  
    debug1: Remote protocol version 2.0, remote software version OpenSSH_4.3
  
    debug1: match: OpenSSH_4.3 pat OpenSSH*
  
    debug1: Enabling compatibility mode for protocol 2.0
  
    debug1: Local version string SSH-2.0-OpenSSH_4.3
  
    debug1: SSH2_MSG_KEXINIT sent
  
    debug1: SSH2_MSG_KEXINIT received
  
    debug1: kex: server->client aes128-cbc hmac-md5 none
  
    debug1: kex: client->server aes128-cbc hmac-md5 none
  
    debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
  
    debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
  
    debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
  
    debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
  
    The authenticity of host '192.168.2.70 (192.168.2.70)' can't be established.
  
    RSA key fingerprint is 3d:33:ce:58:2c:27:6a:bb:93:19:14:f7:7b:bc:42:8a.
  
    Are you sure you want to continue connecting (yes/no)?
  
    上面最后一行,就已经提示输入yes或是no了。这是两台机器建立临时信任机制的过程。
  
    通过信息我们可以想到,scp命令使用是SSH服务的22端口进行通信。所以这一步输入“yes”
  
    Are you sure you want to continue connecting (yes/no)? yes
  
    Warning: Permanently added '192.168.2.70' (RSA) to the list of known hosts.
  
    debug1: ssh_rsa_verify: signature correct
  
    debug1: SSH2_MSG_NEWKEYS sent
  
    debug1: expecting SSH2_MSG_NEWKEYS
  
    debug1: SSH2_MSG_NEWKEYS received
  
    debug1: SSH2_MSG_SERVICE_REQUEST sent
  
    debug1: SSH2_MSG_SERVICE_ACCEPT received
  
    debug1: Authentications that can continue: publickey,gssapi-with-mic,password
  
    debug1: Next authentication method: gssapi-with-mic
  
    debug1: Unspecified GSS failure. Minor code may provide more information
  
    No credentials cache found
  
    debug1: Unspecified GSS failure. Minor code may provide more information
  
    No credentials cache found
  
    debug1: Unspecified GSS failure. Minor code may provide more information
  
    No credentials cache found
  
    debug1: Next authentication method: publickey
  
    debug1: Trying private key: /root/.ssh/identity
  
    debug1: Trying private key: /root/.ssh/id_rsa
  
    debug1: Trying private key: /root/.ssh/id_dsa
  
    debug1: Next authentication method: password
  
    [email protected]'s password:
  
    这时候,想如果使用没有密码的用户,是否就不会跳出输入密码的部分了呢?
  
    尝试操作:
  
    1、去掉接收文件机器上的密码:
  
    [root@test1 ~]# passwd -d root
  
    Removing password for user root.
  
    passwd: Success
  
    [root@test1 ~]#
  
    2、尝试登录:
  
    login as: root
  
    [email protected]'s password:
  
    Access denied
  
    3、执行脚本试一试:
  
    [root@test2 idaphne]# scp -rv 1.txt [email protected]:/root/scripts/
  
    Executing: program /usr/bin/ssh host 192.168.2.70, user roo, command scp -v -r -t /root/scripts/
  
    OpenSSH_4.3p2, OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
  
    (中间信息略)
  
    [email protected]'s password:
  
    debug1: Authentications that can continue: publickey,gssapi-with-mic,password
  
    Permission denied, please try again.
  
    [email protected]'s password:
  
    4、说明:
  
    删除root密码后,从机器终端是可以登录的,但在远程是无法登录的。
  
    早期版本的linux如ReadHat8以前的版本,只要删除了root密码,在执行脚本后,需要输入密码的时候,输入任意字符就可以登录。
  
    ========================================================================================================
  
    按照以上的方法是不成功的,查阅了大量资料后发现有一篇文章提及“scp和rsync的实际应用”,文章大致内容如下:
  
    http://www.lslnet.com/linux/dosc1/30/linux-238181.htm
  
    近段时间工作需要做了些scp和rsync的异地安全备份,整理了一下,希望多大家有用。
  
    scp的备份指南:
  
    需求:用scp自动完成异地文件的定时copy
  
    难点:如何让异地主机建立安全的信任关系
  
    1、在A机器上用root运行ssh-keygen,将生成/root/.ssh/identity和/root/.ssh/identity.pub两个文件;
  
    2、在A机器上运行scp /root/.ssh/identity.pub [email protected]:/upload/.ssh/authorized_keys(假设B机器的IP地址为192.168.1.10,B机器上开了用户test,要上传到的目录是/upload,需输入密码)。目的是将本地的identity.pub放到远程机器上并改名为authorized_keys,这样就建立了新任主机,以后就不需要每次ssh都需要输入密码了;
  
    3、通过crontab建立脚本,例:30 02 * * 1-5 scp /home/data/* [email protected]:/upload。
  
    (每天2:30am自动将/home/data下面的所有文件以test用户名传到远程主机192.168.1.10的/upload目录中);
  
    认证原理:
  
    如果你希望从A作为用户user1 SSH 到B 作为用户user2, 若要用RSA键对法认证且不需要密码,则B上的ssh 后台程序拿出~user2/.ssh/authorized_keys中的与A有关的RSA公钥来对A上的以user1身份运行的ssh客户程序进行挑战,前面我们已经把A上的identity.pub拷贝到B上作为authorized_keys了。则A保持私钥identity,而B上的sshd又拿出A的公钥来挑战,因此成功,你可以加很多行到authorized_keys以允许其它服务器的公钥可以加进来。
  
    scp特点:
  
    使用ssl加密,安全性高。
  
    rsync的备份指南:
  
    需求:用rsync完成异地文件的同步
  
    难点:如何建立异地信任关系
  
    1、在A主机上(rsync服务器)上编译安装rsync,需要版本在2.4.3以上(http://rsync.samba.org),在/etc目录下建立rsyncd.conf文件,内容如下:
  
    uid = nobody
  
    gid = nobody
  
    use chroot = no # 不使用chroot
  
    max connections = 4 # 最大连接数为4
  
    log file = /var/log/rsyncd.log
  
    pid file = /var/run/rsyncd.pid
  
    lock file = /var/run/rsync.lock # 日志记录文件
  
    [test] # 这里是认证的模块名,在客户端需要指定
  
       path = /home/test # 需要同步的目录
  
       comment = test folder
  
       uid = root
  
       ignore errors # 可以忽略一些无关的IO错误
  
       read only = yes # 只读
  
       list = no # 不允许列文件
  
       auth users = rsynctest # 认证的用户名,如果没有这行,则表明是匿名
  
       secrets file = /etc/test.scrt # 认证用户密码文件
  
    2、在/etc下建立test.scrt文件,输入:
  
    用户名:密码
  
    例:rsynctest:testrsync
  
    将文件属性修改为600(千万注意)
  
    3、启动rsync服务:rsync --daemon (rsync运行在tcp 873端口,可以通过netstat -an|grep LISTEN察看)。
  
    4、在B主机上(rsync客户机)上建立/etc/test文件,内容为A主机的密码,例:
  
    testsync
  
    5、用crontab建立脚本,例:0 21 * * 1-5 rsync -vzrtp --progress --delete --password-file=/etc/test [email protected]::test /home/rsynctest
  
    rsync中的参数:v是verbose,z是压缩,r是recursive,tp都是保持文件原有属性如属主、时间
  
    的参数。--progress是指显示出详细的进度情况,--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。--password-file=/etc/test来指定密码文件,这样就可以在脚本中使
  
    用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读(600)。
  
    [email protected]中,rsynctest是指定密码文件中的用户名,192.168.1.10是A主机的IP地址::test是指模块名[test],也就是在/etc/rsyncd.conf中自定义的名称。最后的/home/rsynctest是备份到本地的目录名。
  
    (也可以用-e ssh的参数建立起加密的连接,然后和scp中信任主机的办法一样如法炮制)
  
    (在上面实例中的rsynctest并不是真实的用户,可以根据自己需要文本定义,这也是使用rsync的一大好处)
  
    rsync的特点:
  
    特性如下:
  
    1、可以镜像保存整个目录树和文件系统。
  
    2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。
  
    3、无须特殊权限即可安装。
  
    4、优化的流程,文件传输效率高。
  
    5、可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
  
    6、支持匿名传输。
  
    rsync的功能还很强大,深入的眼就可以到官方网站上了解。
  
    ==========================================================================================================资料中介绍:
  
    在两台机器的两个用户之间建立安全的信任关系后,可实现执行scp命令时不需要输入用户密码。
  
    ==========================================================================================================下面实现操作:
  
    1、首先在“执行脚本”的机器上,root用户执行ssh-keygen命令,生成建立安全信任关系的证书:
  
    [root@test2 idaphne]# ssh-keygen -b 1024 -t rsa
  
    Generating public/private rsa key pair.
  
    #出现下面位置部分,直接回车即可,或输入目录位置,来存储生成的文件,这里回车。
  
    Enter file in which to save the key (/root/.ssh/id_rsa):
  
    #<-- 直接输入回车,表示不需要密码,因为我们的目的就不需要这个密码了。
  
    Enter passphrase (empty for no passphrase):
  
    #<-- 直接输入回车,既然上面密码都没输入,自然这里也直接回车即可。
  
    Enter same passphrase again:
  
    Your identification has been saved in /root/.ssh/id_rsa.
  
    Your public key has been saved in /root/.ssh/id_rsa.pub.
  
    The key fingerprint is:
  
    b5:2c:45:9a:6e:de:ff:f2:e0:1e:e6:bb:00:78:e6:f8 [email protected]
  
    [root@test2 idaphne]#
  
    注意:
  
    在程序提示输入passphrase时直接输入回车,表示无证书密码。
  
    上述命令将生成私钥证书id_rsa和公钥证书id_rsa.pub,存放在用户家目录的.ssh子目录中。
  
    [root@test2 idaphne]# cd /root/.ssh/
  
    [root@test2 .ssh]# pwd
  
    /root/.ssh
  
    [root@test2 .ssh]# ls
  
    id_rsa id_rsa.pub known_hosts
  
    [root@test2 .ssh]#
  
    2、将公钥证书id_rsa.pub复制到机器“接收数据的机器”的root家目录的.ssh子目录中,同时将文件名更换为authorized_keys。
  
    [root@test2 .ssh]# scp -p id_rsa.pub [email protected]:/root/.ssh/authorized_keys
  
    #输入机器“接收数据的机器”的root用户密码
  
    [email protected]'s password:
  
    id_rsa.pub 100% 230 0.2KB/s 00:00
  
    [root@test2 .ssh]#
  
    可以看到这个步骤,还是需要输入密码的。
  
    说明:
  
    在执行传输文件“id_rsa.pub”所需要的命令时,两台机器的root用户之间还未建立安全信任关系,所以还需要输入机器“接收数据的机器”的root用户密码。
  
    经过以上2步,就在机器“执行脚本”的root和机器“接收数据的机器”的root之间建立安全信任关系。
  
    下面我们看看效果:
  
    [root@test2 idaphne]# pwd
  
    /usr/local/mysql/var/idaphne
  
    [root@test2 idaphne]# ls
  
    1.txt 2.txt 3.txt
  
    [root@test2 idaphne]# scp -p 1.txt [email protected]:/usr/local/mysql/var/idaphne
  
    1.txt 100% 2 0.0KB/s 00:00
  
    [root@test2 idaphne]#
  
    到这里,实验结束,结果是成功的,这样将scp命令中就不用在输入密码了。
  
    下面另加一段:
  
    当执行scp命令的时候,如果出现了如下错误:
  
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  
    @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
  
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  
    IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
  
    Someone could be eavesdropping on you right now (man-in-the-middle attack)!
  
    It is also possible that the RSA host key has just been changed.
  
    The fingerprint for the RSA key sent by the remote host is
  
    62:5a:5b:e3:be:5e:fa:ec:94:35:d2:de:db:c9:b1:f4.
  
    Please contact your system administrator.
  
    Add correct host key in /root/.ssh/known_hosts to get rid of this message.
  
    Offending key in /root/.ssh/known_hosts:3
  
    RSA host key for 192.168.2.70 has changed and you have requested strict checking.
  
    Host key verification failed.
  
    lost connection
  
    这是因为:/root/.ssh/known_hosts记录rsa相关信息,删除,其中关于,上面错误中显示主机:192.168.2.70的记录即可。

你可能感兴趣的:(linux)