美文网首页
【Linux命令/Mac适用】使用shell script实现s

【Linux命令/Mac适用】使用shell script实现s

作者: 爱睡的蟹老板 | 来源:发表于2019-02-13 22:34 被阅读0次

为了能编写脚本跟远程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

相关文章

网友评论

      本文标题:【Linux命令/Mac适用】使用shell script实现s

      本文链接:https://www.haomeiwen.com/subject/fhvjeqtx.html