ssh采用expect实现自动输入密码登录、拷贝

1. 引言

最近做了一个项目,需要频繁与另一台主机进行文件的传输;中间想到了很多方式:FTP、samba、curl等,但是还是感觉scp最好用。

但scp也存在着一些问题,每次都需要输入目标机的密码,需人为手动干预,这个就比较烦了,那么有没有可以自动进行界面交互的命令呢?

使用shell嵌套使用expect命令工作,很好的达到了文件的批量传输,无需人工干预的效果。

2. 内容详解

2.1 目标

本博的目的是为了解决项目中出现的问题:scp文件时,需要人为干预(输入密码等),且scp需要输入目的主机+绝对路径

而采用本博的脚本,可以实现快速简单的文件拷贝,而不需要输入目标主机的ip等,且无需人为干预输入目的主机的密码,实现快速、高效的文件传输

2.2 实现框架

  • 1 目标主机的ip地址以变量的形式写入到脚本中,因此省略了每次输入目标ip的繁琐
  • 2 将目标主机的登录密码写入到脚本中,采用expect工具自动抓取密码,省略了人为的交互界面
  • 3 scp分为pull和push两种情况,本脚本的处理是:
    • push状态:即推送文件到目的主机,推送到的位置固定在目标主机的一个目录下,因此,便可以省略了每次都要写目标主机和存放的文件位置;命令如下:

      scp <local-file/dir>

    • pull状态:即从远程目标主机拉取文件到本机,无需写目标主机的ip,只要写上需要拉取的目标主机的文件和本机存放的位置即可,命令如下:

      scp <remote-file/dir> <local-file/dir>

2.3 实现代码

#==============================================================
#CopyRight: [email protected]_nie
#E-mail: [email protected]
#Autor  Date        Modify
#Jimmy  2018-06-01  create
#==============================================================
#!/bin/bash

TAR_MAC="[email protected]"     #目标主机的IP地址
TAR_DIR="/mnt/UDISK"            #目标主机存放文件的位置

# 1. Determine the scp is push or pull, if there only 1 argument(push); 2(pull)
if [ $# -eq 1 ];then
    FLAG="PUSH"
elif [ $# -eq 2 ];then
    FLAG="PULL"
else
    echo -e "scpd useage:\n\tscpd local_dir[file] \t\t\t --- push local dir/file to remote $TAR_MAC:$TAR_DIR             \n\tscpd remote_dir[file] local_dir[file] \t --- pull $TAR_MAC file/dir to local [without $TAR_MAC, only remote dir/file]\n"
    exit 1
fi 

# 2. If push, Determine whether the destinated file existed or not
if [ "$FLAG" == "PUSH" ];then
    if [ -f $1 -o -d $1 ];then
        expect -c "                                     #采用expect工具的命令(注意与shell命令的差异)
            spawn scp -r \"$1\" \"$TAR_MAC:$TAR_DIR\"   #-r为递归,将本机的文件/目录发送到目标机的固定位置
            expect \"*password:\"                       #当遇到以“*password:”结尾的字符串时
            set timeout 100                             #设置超时时间,超过这个时间,scp执行失败
            send \"123123\r\"                           #将密码填入到password中,相当于人为输入密码
            expect eof                                  #执行结束
        "
    else
        echo -e "$1 does not normal file or directory"
        exit 1
    fi

# 3. If pull, determine whether local dir existed or not
elif [ "$FLAG" == "PULL" ];then
    if [ ! -e $2 -a "$2" == "*/" ];then     #如果本机的目录不存在,则创建该目录,再执行拷贝
        mkdir -p \"$2\"
        expect -c "
            spawn scp -r \"$TAR_MAC:$1\" \"$2\"
            expect \"*password:\"
            set timeout 600
            send \"123123\r\"
            expect eof
        "
    else
        expect -c "
            spawn scp -r \"$TAR_MAC:$1\" \"$2\"
            expect \"*password:\"
            set timeout 600
            send \"123123\r\"
            expect eof
        "
    fi

fi

#4. Output error info
if [ ! $? -eq 0 ]; then
    if [ "$FLAG" == "PUSH" ];then
        echo -e "PUSH $1 to $TAR_MAC:$TAR_DIR failed"
    elif [ "$FLAG" == "PULL" ];then
        echo -e "PULL $2 from $TAR_MAC:$1 failed"
    fi
fi

原文地址:https://www.cnblogs.com/Jimmy1988/p/9129356.html

时间: 2024-07-29 12:53:03

ssh采用expect实现自动输入密码登录、拷贝的相关文章

Shell结合Expect实现自动输入密码

Shell结合Expect自动输入密码示例 1 #!/bin/bash 2 3 cd /data/live 4 5 /usr/bin/expect <<-EOF 6 spawn git clone "ssh://xxxxxxxxxxxx" 7 expect "*passphrase*" 8 send "passwordhere\n" 9 expect eof 10 EOF 11 12 time=`/bin/date "+%Y

iTerm 使用expect实现自动远程登录,登录跳板机

#!/usr/bin/expect set timeout 10 spawn ssh -p [lindex $argv 0] [lindex $argv 1]@[lindex $argv 2] expect { "(yes/no)?" {send "yes\n";exp_continue} "password:" {send “<password>\n"} } expect “*<服务器名>*" {se

Linux下Expect 完成自动输入密码

今天要开发一个定时任务,然后加入cron列表中.但是有个问题摆在眼前,脚本的执行中需要输入数据库密码(貌似5.1版本以上不允许在-p后直接加密码,会报错) mysql -u root -p << SQL use db; set names utf8; `cat task.sql` SQL 运行上述代码后,会提示: Enter password: expect可以帮助我们完成这件事情: 将上述代码保存到一个文件中:db.sh 并且编写如下代码保存为db.exp: #!/usr/bin/expec

通过expect免自动输入密码登陆远程服务器

1.前提必须已经安装expect 2.新建login.sh,文件内容如下 #!/usr/bin/expect -f spawn ssh [email protected]expect "password:"send "passwordR\r"interact 3.执行./login.sh即可登陆远端服务器

使用expect实现自动登录的脚本

使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理. 脚本代码如下: ############################################## #!/usr/bin/expect set timeout 30 spawn ssh -l username 192.168.1.1 expect "password:" send "ispass\r&

ssh自动输入密码脚本 切换目录脚本

利用expect的,首先查看expect,命令:which expect #!/usr/bin/expect -f spawn ssh 用户名@ip地址 expect "assword:" send "password\r" interact 自动输入密码,切换目录 #!/usr/bin/expect -f spawn ssh 用户名@ip地址 -t "cd xxxxx;bash --login" expect "assword:&qu

Linux expect实现自动登录

expect expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令.当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令.但当不能使用密钥验证的时候,我们就没有办法了.所以,这时候只要知道对方机器的账号和密码就可以通过expect脚本实现登录和远程命令. 引言 目前在公司是一人一台虚拟机,大多数工作都要在虚拟机上完成,为此每天要执行很多次[ssh [email protected]]指令登录虚拟机:有很多方式解决这个问题,如使用xshell.secureCRT

Linux SSH 基于密钥交换的自动登录原理简介及配置说明

协商交互过程 客户端向目标服务器发送登录请求.在SSH 服务启用了证书验证登录方式后,会优先通过证书验证方式进行登录验证. 目标服务器根据 SSH 服务配置,在用户对应目录及文件中读取到有效的公钥信息. 目标服务器生成一串随机数,然后使用相应的公钥对其加密. 目标服务器将加密后的密文发回客户端. 客户端使用默认目录或 -i 参数指定的私钥尝试解密. 如果解密失败,则会继续尝试密码验证等其它方式进行登录校验.如果解密成功,则将解密后的原文信息重新发送给目标服务器.意思类似于:"看,这是这段话的原文

Linux通过Shell对文件自动进行远程拷贝备份

在执行计划任务拷贝文件的时候,用scp命令需要输入密码,这里用公共密钥的方式实现密码的自动输入. 具体操作: 要求:把192.168.0.2机上的test.tar拷贝到192.168.0.3机器的上 192.168.0.2服务器上:mkdir -p ~/.sshchmod 700 ~/.sshssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa 在192.168.0.3建立好.ssh目录后,从192.168.0.2拷贝~/.ssh/id_rsa.pub到19