scp自动填充密码shell脚本

安装expect

1
sudo apt-get install ecpect

编写脚本mq_scp.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/expect
#*************************************************************************
# ./mq_scp.sh 目标上传文件
#*************************************************************************
set timeout 30
set user root
set pass 12398qq.
set dir /root/mq_blog/source/_posts
set ip 39.96.68.13
set filen [lrange $argv 0 0]
# [lrange $argv 0 0] 0 0表示第一个参数

spawn scp ${filen} ${user}@${ip}:${dir}
expect "${user}@${ip}'s password:"
send "${pass}\r"
interact

软连接到环境变量目录

1
sudo ln -s /home/maqi/blog/test/mq_scp.sh /usr/local/bin/mq_scp

之后任意终端输入mq_scp 目标上传文件即可。

except介绍

  • !/usr/bin/expect

    告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。

  • set timeout 30

    设置超时时间。

  • spawn

    spawn是进入expect环境后才可以执行的expect内部命令,主要的功能是给ssh运行进程加个壳,用来传递交互指令。

  • expect “password:”
    这里的expect也是expect的一个内部命令。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒。

  • send “${pass}\r”
    执行交互动作,与手工输入密码的动作等效。

    命令字符串结尾别忘记加上“\r”。

  • interact

    执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了,如果没有这一句登录完成后会退出。

编写脚本同步博客

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/expect
#*************************************************************************
# ./mq_sync_blog.sh 目标上传文件
#*************************************************************************
set timeout 30
set user root
set pass 12398qq.
set ip 39.96.68.13

spawn ssh ${user}@${ip}
expect "${user}@${ip}'s password:"
send "${pass}\r"
expect "#"
send "cd /root/mq_blog\r"
expect "#"
send "./quick_push\r"

expect "#"
send "cd /root/fluid_blog\r"
expect "#"
send "./quick_push\r"
interact
#expect eof

软连接到环境变量目录

1
sudo ln -s /home/maqi/blog/test/mq_sync_blog.sh /usr/local/bin/mq_sync_blog

之后任意终端输入mq_sync_blog即可。