• 通过scp拷贝文件时无需交互输入密码


        工作中经常需要把一些文件从一个服务器传输到另一台服务器,linux环境下最习惯的方式当然是scp,但是scp需要交互输入密码有时候觉得麻烦,记录几种无需手动输入密码的方法。

    方法一:建立SSH互信

        此方式不仅是方便scp,在可靠系统间此方式也是非常方便的连接方式,具体建立互信操作过程暂略,前面地方有单独记录过了。

    方法二:使用sshpass工具

        建立信任关系的做法是最方便和安全的做法,但是在有些场景下(比如远端的authorized_keys是不能随意更改的),那么这个时候我们就可以借助sshpass这个第三方工具来完成ssh连接时的密码输入。先看一下sshpass的man手册中是如何描述的:

        sshpass - noninteractive ssh password provider

        从描述上就可以清晰的了解到,sshpass的设计就是为了使用非交互的场景下输入ssh连接的密码。

        sshpass的使用比较简单,先看一下帮助文档:

        root@localhost:~# sshpass 
        Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters
           -f filename   Take password to use from file
           -d number     Use number as file descriptor for getting password
           -p password   Provide password as argument (security unwise)
           -e            Password is passed as env-var "SSHPASS"
           With no parameters - password will be taken from stdin
           -h            Show help (this screen)
           -V            Print version information
        At most one of -f, -d, -p or -e should be used

        其中-p是直接指定密码,-f是从文件中读取密码。那么一个使用sshpass的简单例子就是:

        

    [root@node1 ~]# sshpass -f pa.txt scp index root@192.168.10.22:/var
    [root@node1 ~]# sshpass -p root1234 scp config.log root@192.168.10.22:/root/a.lo

      使用sshpass的好处就是方便直接,无需了解公私钥、加密认证等相关知识,简单易懂;但是使用sshpass最大的坏处就是在使用时会涉及到明文密码,大大降低了安全性。

    方式三:使用expect脚本来输入密码

        expect用于自动化地执行linux环境下的命令行交互任务,例如scp、ssh之类需要用户手动输入密码然后确认的任务。有了这个工具,定义在scp过程中可能遇到的情况,然后编写相应的处理语句,就可以自动地完成scp操作了。

        下面就是一个使用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
    "  
        expect "*assword:" { send "$password
    "}  
      }  
     "*assword:"  
      {  
        send "$password
    "  
      }  
    }  
    expect "100%"  
    expect eof  

        意代码刚开始的第一行,指定了expect的路径,与shell脚本相同,这一句指定了程序在执行时到哪里去寻找相应的启动程序。代码刚开始还设定了timeout的时间为10秒,如果在执行scp任务时遇到了代码中没有指定的异常,则在等待10秒后该脚本的执行会自动终止。

        从以上代码刚开始的几行可以看出,我为这个脚本设置了5个需要手动输入的参数,分别为:目标主机的IP、用户名、密码、本地文件路径、目标主机中的文件路径。如果将以上脚本保存为expect_scp文件,则在shell下执行时需要按以下的规范来输入命令:

    ./expect_scp 192.168.10.21 root 123456 /root/src_file /root/dest_file 

        以上的命令执行后,将把本地/root目录下的src_file文件拷贝到用户名为root,密码为123456的主机192.168.10.21中的/root下,同时还将这个源文件重命名为dest_file。

        spawn代表在本地终端执行的语句,在该语句开始执行后,expect开始捕获终端的输出信息,然后做出对应的操作。expect代码中的捕获的(yes/no)内容用于完成第一次访问目标主机时保存密钥的操作。有了这一句,scp的任务减少了中断的情况。代码结尾的expect eof与spawn对应,表示捕获终端输出信息的终止。

        使用expect需要了解的一点是:用expect速度会比较慢,因为需要等待返回的数据,然后输入命令执行,没有ssh密钥登录的快速。

        安全性和速度上考虑建立信任关系都是最佳的方法,至于在具体的环境中选择什么根据实际情况来选择。

    o(=•ェ•=)m纸上得来终觉浅,绝知此事要躬行o(=•ェ•=)m
  • 相关阅读:
    2020/12/2
    2020/12/1
    Cannot do a soft reset in the middle of a merge
    webpack img
    rm -fr ".git/rebase-apply"
    css 颜色
    初始化样式
    a标签
    esma 最新
    前端
  • 原文地址:https://www.cnblogs.com/occl/p/6564879.html
Copyright © 2020-2023  润新知