Linux expect 自动登录远程服务器

使用场景

在自己的电脑上登录到远程服务器执行一些操作,需要先在本机执行 ssh root@192.168.31.128,进入服务器后,再执行操作。 可以使用shell脚本使这一系列操作自动化。但包含 ssh root@192.168.31.128 的shell脚本在执行时,需要手动输入密码。 使用 expect 可自动输入密码。

具体使用如下文所述。

需要两个文件 publish.shauto-publish.exp

publish.sh 非必需,可将该文件中的命令转移到 auto-publish.exp。 转移方法是,publish.sh 中的 cd /Users/cg/Documents/blog-sphinx/source 等价于 auto-publish.exp 中的 spawn cd /Users/cg/Documents/blog-sphinx/source

auto-publish.exp

#! /usr/bin/expect

set timeout 10

set host "49.235.149.104"
set username "root"
set password "123456"

# 执行具体操作的shell脚本的路径
spawn /Users/cg/Documents/blog-sphinx/source/tool/publish.sh
# 当输出信息中包含 password 时,输入密码
expect "*password*" {send "$password\r"}
#interact
expect eof

publish.sh

#! /bin/bash

cd /Users/cg/Documents/blog-sphinx/source
git add .
git commit -a -m'提交代码'
git push origin master

ssh root@49.235.149.104 '
echo "进入目录"
cd /home/cg/sphinx-blog-source/source
echo "拉取代码"
git pull origin master
echo "生成HTML"
cd /home/cg/sphinx-blog-source
sphinx-build -b html /home/cg/sphinx-blog-source/source /home/cg/my-sphinx-blog
echo "结束"
'

注解

ssh root@49.235.149.104 ‘some code’ 中的单引号也可换成双引号,视引号内使用了双引号还是单引号而定。此处的引号一定不能缺少。