为了能编写脚本跟远程Linux主机交互,首先要安装expect
对于Mac用户来说,通过homebrew来安装比较方便
brew install expect
安装好之后,就可以写脚本文件了,用nano编辑即可
nano sshvpn.sh
sshvpn.sh内容如下:
#!/usr/bin/expect
set timeout 60
spawn ssh root@157.230.152.7
expect "password:"
send "登录密码\r"
expect ":~#"
send "ssserver -c /etc/shadowsocks.json -d start\r"
expect eof
可以理解为,写一个脚本模拟交互的过程:
用spawn打开一个ssh进程
expect "password:" 可以理解为等屏幕出现"password:” 时,
执行下面的语句,send可以理解为模拟键盘输入,也就是输入登录密码然后按回车
成功登录之后,等屏幕显示":~#”之后,就可以输入命令了:
ssserver -c /etc/shadowsocks.json -d start\r
该命令将启动代理服务器
脚本编辑完毕后,保存退出,并使用chmod命令赋予执行的权限
chmod +x sshvpn.sh
然后就可以执行该脚本文件,实现【一键启动远程代理服务器】
./sshvpn.sh
注意:自己写的脚本,用 ./ 来执行!
./代表当前目录,由于自己编写的脚本就在当前目录下,而当前目录不在环境变量中,所以得输入包含完整目录的文件名
环境变量PATH,里面包含了许多目录,这些目录下的可执行文件就无需输入完整路径来执行
ref: https://zhidao.baidu.com/question/549373418.html
类似地,可以再写一个【一键停止远程代理服务器】,sshvpn_stop.sh
只要把start改成stop即可
#!/usr/bin/expect
set timeout 60
spawn ssh root@157.230.152.7
expect "password:"
send "登录密码\r"
expect ":~#"
send "ssserver -c /etc/shadowsocks.json -d stop\r"
expect eof
执行结果如下:
root@157.230.152.7's password: bogon:Desktop xiewf$ ./sshvpn.sh
spawn ssh root@157.230.152.7
root@157.230.152.7's password:
Linux bossqiao-vm 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Feb 13 13:59:32 2019 from 171.117.21.152
root@bossqiao-vm:~# ssserver -c /etc/shadowsocks.json -d stop
INFO: loading config from /etc/shadowsocks.json
2019-02-13 14:03:20 INFO loading libcrypto from libcrypto.so.1.1
stopped
expect还可以根据屏幕显示的不同情况,进行不同的互动,例子如下:
#!/usr/bin/expect
set timeout 10
set password 123456
spawn ssh ubuntu@xxx.xxx.xxx.xxx
expect {
"(yes/no)?" {
send "yes\r";
expect "password:";
send "${password}\r";
exp_continue;
}
"password:" {
send "${password}\r";
exp_continue;
}
}
interact
6~17 行用了一个 expect 命令,可以将这个命令理解为期待shell中输出结果中包含什么关键字
如果包含的是 (yes/no)? 则表示是第一次连接这个远程服务器
需要手动确认是否保存生成的密钥到 ~/.ssh/know_hosts 当中
通过send命令输出 yes 到shell中
之后再次期望shell的输出结果中包含 password:关键字
再用send命令输出密码。
如果包含的是 password: 则表示不是第一次连接这个远程服务器
直接用send输出密码即可
ref: https://blog.csdn.net/qq_33215972/article/details/82386349
网友评论