`

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

阅读更多
转自:http://blog.tianya.cn/blogger/post_read.asp?BlogID=3668847&PostID=32922633
由于很多部门需要从公司服务器后台的数据库中去拉报表,
  
    且因为每个部门对数据库表的需求、字段的需求不一样,
  
    例如:
  
    客服可能需要用户表、仓库产品表。
  
    而产品部门却需要产品列表等。
  
    这样会导致数据库反复的去检索查询数据库中的数据,并且在前段用户同时访问的情况下,这样就无形的导致
  
    数据库系统以及操作系统的压力过大。
  
    为解决这个问题,所以准备将数据库整个目录定时备份到另一台机器上,然后使得需要拉报表的人员从这台backup的机器上去拉报表。
  
    ========================================================================================================
  
    问题出现:
  
    但是这时候写脚本,问题就出现,因为我要从这个“执行脚本”的机器上面备份到另一台“接收数据”的机器上去。
  
    这时候就想到了SCP命令。
  
    但是我们知道在使用SCP命令的时候,其中因为安全机制的问题会跳出输入密码的部分,而且如果两台机器如果是第一次互相通信,
  
    那么还会出现如下的需要确认的信息:
  
    [root@test2 idaphne]# scp -rv 1.txt roo@192.168.2.70:/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
  
    roo@192.168.2.70's password:
  
    这时候,想如果使用没有密码的用户,是否就不会跳出输入密码的部分了呢?
  
    尝试操作:
  
    1、去掉接收文件机器上的密码:
  
    [root@test1 ~]# passwd -d root
  
    Removing password for user root.
  
    passwd: Success
  
    [root@test1 ~]#
  
    2、尝试登录:
  
    login as: root
  
    root@192.168.2.70's password:
  
    Access denied
  
    3、执行脚本试一试:
  
    [root@test2 idaphne]# scp -rv 1.txt roo@192.168.2.70:/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
  
    (中间信息略)
  
    roo@192.168.2.70's password:
  
    debug1: Authentications that can continue: publickey,gssapi-with-mic,password
  
    Permission denied, please try again.
  
    roo@192.168.2.70'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 test@192.168.1.10:/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/* test@192.168.1.10:/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 rsynctest@192.168.1.10::test /home/rsynctest
  
    rsync中的参数:v是verbose,z是压缩,r是recursive,tp都是保持文件原有属性如属主、时间
  
    的参数。--progress是指显示出详细的进度情况,--delete是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。--password-file=/etc/test来指定密码文件,这样就可以在脚本中使
  
    用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有属主可读(600)。
  
    rsynctest@192.168.1.10中,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 root@test2.rsync.com
  
    [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 root@192.168.2.70:/root/.ssh/authorized_keys
  
    #输入机器“接收数据的机器”的root用户密码
  
    root@192.168.2.70'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 root@192.168.2.70:/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批量scp命令执行工具 可批量对多个Linux主机执行传输文件命令 方便省力 适合统一化管理Linux服务器

    在日常运维工作中,经常需要在多台远程Linux主机之间传输文件,这时,手动执行scp命令会显得效率低下且容易出错。为了解决这个问题,就有了“Linux批量scp命令执行工具”,它能够帮助管理员批量地对多个Linux主机...

    不需要远程传输文件Linux如何关闭scp和sftp命令.docx

    scp命令是用于在两台主机之间传输文件的命令,通常用scp命令通过ssh获取对方Linux主机文件时,需要输入密码确认。方法类似于ftp命令,但是scp命令更加安全。 禁止scp命令 要禁止scp命令,需要删除openssh-clients...

    python执行scp命令拷贝文件及文件夹到远程主机的目录方法

    Python执行SCP命令是一种在编程中实现自动化文件传输到远程服务器的常见方法,特别是在需要脚本化或批量处理任务时。SCP(Secure Copy)是基于SSH协议的安全文件传输工具,它允许用户通过加密连接将文件从本地复制到...

    解决linux scp无需密码问题

    如果不设置密码,后续使用时将无需输入密码,从而实现无密码传输。 2. **备份公钥文件**: - 将生成的公钥文件`id_rsa.pub`进行备份,例如重命名为`id_rsa.pub.A`。 3. **在远程服务器上生成SSH密钥对**: - ...

    通过秘钥实现scp不输入密码传送文件

    标题所述的"通过秘钥实现scp不输入密码传送文件"是一种使用SSH密钥对进行身份验证的方法,以避免在执行SCP(Secure Copy)命令时反复输入密码。SCP是基于SSH协议的安全文件传输工具,通常用于在不同的主机之间复制...

    linux scp传输不用密码

    通常情况下,我们通过输入密码来进行身份验证,从而实现文件的传输。但在某些应用场景下,为了提高效率或自动化操作的需求,我们需要实现SCP传输时无需密码的操作。这主要依赖于公钥认证机制来实现。 #### 公钥认证...

    Linux下SSH及SCP命令简单使用

    进行远程连接的步骤非常简单,只需要在终端中输入命令“ssh 用户名@远程主机地址”,然后输入该用户的登录密码即可进入远程终端模式。 例如,假设您想远程连接到IP地址为***.***.**.**的远程主机,您可以在Linux...

    使用ssh、scp不需要密码

    生成过程中需要输入密码,可以直接回车不输入密码。 密钥对的使用 生成的密钥对可以用于 ssh 和 scp 登陆和文件传输。如果将公钥复制到要访问的机器上,并保存到 ~/.ssh/authorized_keys 文件中,那么可以不需要...

    Linux攻略 让SSH不再输入密码的实用技巧

    同样的,使用`scp`或`sftp`命令进行文件传输时,也不需要再输入密码。这种方式不仅提高了工作效率,也增加了自动化任务的安全性,因为即使有人获取到了你的公钥,他们也无法没有私钥的情况下进行登录。 总的来说,...

    Linux常用命令大全.pdf

    例如,在使用scp命令远程拷贝文件时,需要输入目标服务器的用户名、密码、IP地址以及路径信息,才能完成文件的远程传输。对于网络通信和文件操作来说,了解并正确设置IP地址、网卡类型、以及通过ping命令测试网络...

    SSH中SCP命令的使用

    同样地,当需要向远程服务器上传文件但服务器未启用FTP服务时,可以通过SCP命令完成。例如,将本地文件`backup.tar.gz`上传至远程服务器`192.168.1.21`的`/tmp/`目录: ``` scp backup.tar.gz root@192.168.1.21...

    Linux服务器scp无密码传输文件操作说明

    为了减少因服务器用户密码定期更改带来的不便以及避免在自动化脚本中输入密码,可以通过设置SSH密钥对实现无密码传输文件。 ##### 准备工作 1. **确认远程服务器22端口开放**:使用`netstat -ntlp | grep ssh`检查...

    python Pexpect 实现输密码 scp 拷贝的方法

    本想直接在bash文件中使用Pexpect 来实现自动输入密码,并scp拷贝文件,但是权限的限制导致不能安装使用Pexpect 。 最后考虑使用python实现。 环境: python2.7 centos from pexpect import * import os cwd = os....

    bash脚本中将密码传递给ssh/scp命令方法详解

    然而,这些命令通常需要用户提供密码,这在脚本化环境中是不理想的,因为手动输入密码是无法实现的。本文将详细介绍如何在bash脚本中处理这个问题。 首先,我们可以使用`sshpass`工具,这是一个允许在不交互的情况...

    System_Ssh_scp.rar_linux scp_scp_system scp

    # 循环遍历服务器列表并执行SCP命令 for SERVER in "${SERVERS[@]}" do scp $SOURCE_FILE user@$SERVER:/path/to/destination done ``` 这个脚本首先定义了源文件的位置和需要接收文件的服务器列表。然后,它遍历...

    使用scp在linux主机之间复制文件目录

    在Linux环境下,scp命令是一种基于SSH协议的安全文件传输工具,常用于在不同主机间安全地传输文件或目录。scp命令不仅提供了简单易用的接口,而且还具备了SSH本身的安全特性,确保数据传输的安全性。 #### 标题与...

    在Linux下用scp复制文件无需输入密码的技巧

    然而,默认情况下,每次使用SCP命令传输文件时都需要输入密码。这对于频繁进行文件传输的操作来说既不便捷也不高效。因此,本文将详细介绍如何在Linux系统中配置免密SCP传输。 #### 二、准备工作 为了实现免密SCP...

    优化scp传输文件到多个主机

    4. **权限与身份验证**:由于scp命令基于SSH,因此需要确保在所有目标主机上都有正确的公钥认证设置,以避免每次传输时输入密码。 5. **错误处理**:在脚本中添加错误处理机制,如捕获scp命令的退出状态码,以便在...

    linux使用scp命令备份文件 scp拷贝文件

    执行该命令时,系统会提示确认是否保存远程主机的密钥,输入`yes`并按回车,然后输入远程服务器的root用户的密码,即可开始文件的传输。 如果遇到`scp: command not found`的错误,说明你的系统中未安装`scp`。在...

Global site tag (gtag.js) - Google Analytics