张风义 發表於 2023-8-19 00:00:00

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]
查看完整版本: expect命令在linux下实现批量ssh免密