expect命令在linux下实现批量ssh免密
<p>有时候我们需要批量发送ssh命令给服务器,但是有可能有些服务器是新加入的,还没有配置ssh免密,这个时候就会提示我们输入yes/no 或者password等,expect脚本命令就是用于在提示这些的时候,自动为我们输入相应的文字.</p>
<p>
expect脚本</p>
<p>
先看一段shell脚本,实现了ssh自动连接</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_661315">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">#!/usr/bin/expect </code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">spawn ssh 192.168.1.241</code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">expect "password"</code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml plain">send "123456\r"</code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml plain">expect "]#" {send "ls -la\r"}</code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml plain">interact</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
注意第一行使用的是#!/usr/bin/expect而不是普通的bash脚本那样</p>
<p>
spawn就是用来启动新的进程</p>
<p>
expect “password" ,注意这个是expect脚本里面内部的命令,代表用来等待进程反馈,可以接受字符串和正则表达式,这段的意思就是将spawn启动的进程的输出当作expect命令的输入,如果包含password脚本,就会向着标准输出 输出123456\r<br>
,注意\r代表换行,跟我们输入完一个命令换行是一个道理。</p>
<p>
send:发送交互值,代替我们手动输入</p>
<p>
接着我们进入了241的服务器里面, 窗口会输出# ,跟我们的]# 匹配上了,于是向控制台输出 ls -la命令并且换行。这里我们的expect后面是带了大括号,跟上面的写在两行的效果一直。可以理解为另一种写法。</p>
<p>
interact的作用很特殊,代表等待spawn命令结束,并且停留在241服务端进行继续交互,如果没有这个,那么有可能expect对应的刚匹配上还没执行send就已经结束了。对应的我们可以使用expect eof,替代interact代表等待spawn结束后退出(在spawn进程结束后会向expect发送eof)</p>
<p>
多分支语法</p>
<p>
上面的这种expect属于单一分支模式,代表就匹配这一种,如果匹配的不是,那么就要自己输入了,但是我们有可能在第一次有不同的提示,这个时候就需要使用多分支语法</p>
<p>
expect 只要匹配到aaa 或者password其中的一种就会输出。</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_863858">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">#!/usr/bin/expect</code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">spawn ssh 192.168.1.241</code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">expect {</code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">"aaa" {send "bbb\r"}</code>
</div>
<div class="line number5 index4 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">"password" { send "nf123456\r"}</code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml plain">}</code>
</div>
<div class="line number7 index6 alt2">
<code class="xhtml plain">expect "]#" {send "ls -la\r"}</code>
</div>
<div class="line number8 index7 alt1">
<code class="xhtml plain">interact</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
expect命令行参数</p>
<p>
上面的expect脚本功能可能都达到了,为了避免有很多expect脚本,我更推荐使用expect命令</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_143352">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">#!/bin/bash</code>
</div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">SERVER="192.168.1.241"</code>
</div>
<div class="line number4 index3 alt1">
<code class="xhtml plain">PASSWD=nf123456</code>
</div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
<code class="xhtml plain">expect -c "</code>
</div>
<div class="line number7 index6 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">set timeout -1;</code>
</div>
<div class="line number8 index7 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">spawn ssh $SERVER;</code>
</div>
<div class="line number9 index8 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">expect {</code>
</div>
<div class="line number10 index9 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">\"yes/no\" { send \"yes\r\" ;exp_contine; }</code>
</div>
<div class="line number11 index10 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">\"password:\" { send \"$PASSWD\r\"; }</code>
</div>
<div class="line number12 index11 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">};</code>
</div>
<div class="line number13 index12 alt2">
</div>
<div class="line number14 index13 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">expect \"]#\" { send \"ls -la \r\" };</code>
</div>
<div class="line number15 index14 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">expect \"]#\" { send \"exit \r\" };</code>
</div>
<div class="line number16 index15 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">expect eof;</code>
</div>
<div class="line number17 index16 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">"</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
上面的shell功能和expect脚本实现的功能一致,都是通过ssh登录进去后输入,ls -la 命令</p>
<p>
set timeout -1 设置超时时间</p>
<p>
expect 后面需要加上-c</p>
<p>
expect 命令用“双引号包围起来的,这点要注意</p>
<p>
里面如果有”需要用\"转义。</p>
<p>
第15行代表ls -la 命令结束后发送一个退出命令,一般需要加上,防止阻塞</p>
<p>
expect eof 匹配spawn结束</p>
<p>
ssh批量免密demo</p>
<div class="jb51code">
<div>
<div class="syntaxhighlighterxhtml" id="highlighter_191559">
<div class="toolbar">
<span>?</span>
</div>
<table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1</div>
<div class="line number2 index1 alt1">
2</div>
<div class="line number3 index2 alt2">
3</div>
<div class="line number4 index3 alt1">
4</div>
<div class="line number5 index4 alt2">
5</div>
<div class="line number6 index5 alt1">
6</div>
<div class="line number7 index6 alt2">
7</div>
<div class="line number8 index7 alt1">
8</div>
<div class="line number9 index8 alt2">
9</div>
<div class="line number10 index9 alt1">
10</div>
<div class="line number11 index10 alt2">
11</div>
<div class="line number12 index11 alt1">
12</div>
<div class="line number13 index12 alt2">
13</div>
<div class="line number14 index13 alt1">
14</div>
<div class="line number15 index14 alt2">
15</div>
<div class="line number16 index15 alt1">
16</div>
<div class="line number17 index16 alt2">
17</div>
<div class="line number18 index17 alt1">
18</div>
<div class="line number19 index18 alt2">
19</div>
<div class="line number20 index19 alt1">
20</div>
<div class="line number21 index20 alt2">
21</div>
<div class="line number22 index21 alt1">
22</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
<code class="xhtml plain">#!/bin/bash</code>
</div>
<div class="line number2 index1 alt1">
<code class="xhtml plain">SERVERS="192.168.1.241 192.168.1.242"</code>
</div>
<div class="line number3 index2 alt2">
<code class="xhtml plain">PASSWD="123456"</code>
</div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="xhtml plain">function sshcopyid</code>
</div>
<div class="line number6 index5 alt1">
<code class="xhtml plain">{</code>
</div>
<div class="line number7 index6 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">expect -c "</code>
</div>
<div class="line number8 index7 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">set timeout -1;</code>
</div>
<div class="line number9 index8 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">spawn ssh-copy-id $1;</code>
</div>
<div class="line number10 index9 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">expect {</code>
</div>
<div class="line number11 index10 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">\"yes/no\" { send \"yes\r\" ;exp_contine; }</code>
</div>
<div class="line number12 index11 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">\"password:\" { send \"$PASSWD\r\";exp_continue; }</code>
</div>
<div class="line number13 index12 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">};</code>
</div>
<div class="line number14 index13 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">expect eof;</code>
</div>
<div class="line number15 index14 alt2">
<code class="xhtml spaces"> </code><code class="xhtml plain">"</code>
</div>
<div class="line number16 index15 alt1">
<code class="xhtml plain">}</code>
</div>
<div class="line number17 index16 alt2">
</div>
<div class="line number18 index17 alt1">
<code class="xhtml plain">for server in $SERVERS</code>
</div>
<div class="line number19 index18 alt2">
<code class="xhtml plain">do</code>
</div>
<div class="line number20 index19 alt1">
<code class="xhtml spaces"> </code><code class="xhtml plain">sshcopyid $server</code>
</div>
<div class="line number21 index20 alt2">
</div>
<div class="line number22 index21 alt1">
<code class="xhtml plain">done</code>
</div>
</div>
</td>
</tr></tbody></table>
</div>
</div>
<div class="codetool" id="codetool">
<div class="code_n">
<textarea></textarea>
</div>
</div>
</div>
<p>
以上就是本次介绍的expect命令在linux下实现批量ssh免密的全部过程,希望能够帮助到你。</p>
<p>
原文链接:http://www.cnblogs.com/nfcm/p/7899831.html</p>
頁:
[1]