Linux的脚本自动 交互

来源:互联网 发布:c 语言入门自学视频 编辑:程序博客网 时间:2024/05/21 06:23

Linux的脚本中自动登陆远程主机方法汇总

 

 

 

为了方便,我写了个脚本自动ssh登录远端机器,如下,这个脚本需要安装expect包

================================

#!/usr/bin/expect
set timeout 30
spawn ssh -l root 192.168.1.117
expect "password:"
send "nopasswd/r"
interact

================================

set timeout 30
设置超时时间的,计时单位:秒

spawn ssh -l root 192.168.1.117
spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。它主要的功能是给ssh运行进程加个壳,用来传递交互指令。

expect "password:"
这里的expect也是expect的一个内部命令,expect的shell命令和内部命令是一样的,但不是一个功能。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒

send "nopasswd/r"
这里就是执行交互动作,与手工输入密码的动作等效。
温馨提示: 命令字符串结尾别忘记加上 “/r”,如果出现异常等待的状态可以核查一下。

interact
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行一段命令就退出,可改为〔expect eof〕

注意:在crontab里执行expect脚本,那么最后一句就不能是interact,应该是expect eof

参考:http://my.unix-center.net/~xiaoshe/tag/expectcrontabmysql定期备份数据库/

如下为网上转载的其他的shell自动交互的方法

 

 

--------------------------------------------------------------------------------
shell脚本中如何进行自动的交互


在编写shell脚本的批处理代码时,一般只要求用户在调用shell时,输入有限的几个参数,然后由shell进行批处理作业,在批处理作业完成之前,中途不会

有任何打断。但是linux有些命令本身是要求进行人机交互的,命令基本上是以一问一答形式在终端上跟用户交互,如passwd、smbpasswd,在设置某个用户

的密码时,传入username参数,回车后系统要求输入密码,而smbpasswd还要求再次输入确认密码,这样就需要人工干预2次,这个命令才能执行完毕。

      最近写一个小工具,恰巧碰到这个问题,用户要求提供一个shell,输入username和端口号后,自动完成linux 用户的创建、密码设置、网上邻居的开

通、代码的检出、apache配置、启动等一系列操作,所有帐号中username跟passwd一致。用户输入shell命令敲击回车后,便不再与系统交互,由系统自动完

成之后的所有操作。

    但由于passwd和smbpasswd两个命令都需要用户干预才能完成,有没有什么办法不用用户干预,由系统模拟用户完成输入操作呢?答案是肯定的,就是利

用linux的管道技术,通过“echo”命令进行标准输出,然后通过管道符“|”转换为passwd和smbpasswd的标准输入,由此模拟人机交互,具体实现:

假设用户调用shell脚本为:

[root@myhost]# ./myshell.sh username

则在脚本里实现为:

#!/bin/sh
#Usage: myshell.sh username
userName=$1;
password=$1;

#add user and set default password
useradd $userName;
#通过设定–stdin参数,指明接受标准输入;
echo $password | passwd - -stdin $userName;

#add samba user and set default password
#通过设置-s参数,指明使用安静模式设置密码
( echo $password ; echo $password  ) | smbpasswd -s -a $userName;  

  这样的话,通过linux 的管道技术,将标准输出通过管道转换为某些命令的标准输入,实现了人工输入的模拟,从而屏蔽了人机交互,实现了完全的自动

化。

 


例子:
 #!/usr/bin/expect -f


set password 密码

spawn scp 用户名@目标IP:拷贝文件的路径 存放本地文件的路径

set timeout 300(s)

expect "用户名@目标ip`s password:"

set timeout 300

send"$password/r"

set timeout 300

send"exit/r"

expect eof

--------------------------------------------------------------------------------

src:http://os.51cto.com/art/200912/167898.htm

你了解Linux系统么?你是Linux系统的应用者么?如果你要学习linux,你可能会遇到Linux Shell自动交互问题,这里将介绍Linux Shell自动交互的解决方法,在这里拿出来和大家分享一下。

一、背景

shell脚本在处理自动循环或大的任务方面可节省大量的时间,通过创建一个处理任务的命令清单,使用变量、条件、算术和循环等方法快速创建脚本以完成相应工作,这比在命令行下一个个敲入命令要省时省力得多。

但是有时候我们可能会需要实现和交互程序如ftp,telnet服务器等进行交互的功能,这时候我们需要用到shell的自动交互功能,本文收集了较常用的三种自动交互方法,并进行了比较和总结。

二、需求

需求1:
从一台Linux机器ftp登陆到另一台Linux机器,进行系列操作后关闭,懒得每次都手动输入密码。

需求2:
改变登录用户密码,懒得每次都输入新旧密码。

需求3:
希望su自动登录到root账户,懒得每次都输入root密码。

三、调试环境

终端:SecureCRT

系统:WinXP, CentOS 4.4(VmWare)

Shell:bash

注:shell有很多种,B类SHELL(sh, bash, ksh)之间行为相近;C类SHELL(csh, tcsh)之间行为相近,还有zsh和rc等shell,本文的调试环境是bash。

四、自动交互方法一

自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法(参考Linux与UNIX SHELL编程指南 chapt 5.7):"command << delimiter  从标准输入中读入,直至遇到delimiter分界符。"

重定向操作符command << delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF,当然完全可以自定为其他字符。

对于需求1 要求的自动登陆ftp,并作系列操作,则可以用这种方法进行自动交互。代码如下:

   1. #!/bin/bash 
   2. ftp -i -n 192.168.167.187 << EOF
   3. user hzc 123456 
   4. pwd 
   5. cd test 
   6. pwd 
   7. close 
   8. bye 
   9. EOF

测试可以发现,如上代码使用帐号名hzc,密码123456成功登陆了ftp服务器,并进入目录,打印出了pwd。

五、自动交互方法二

需求2中要求采用非交互的方式改变登录用户密码,尝试用方法1,无法实现。

这时候联想到交互信息的另一个自动输入方法,管道,通过echo + sleep + | 可以实现这个需求。

   1. #!/bin/bash 
   2. (echo "curpassword" 
   3. sleep 1 
   4. echo "newpassword"  
   5. sleep 1 
   6. echo "newpassword")|passwd

测试通过,运行这个脚本,直接把当前用户的curpassword改成newpassword。

六、自动交互方法三

需求3中要求自动登录root账号,尝试方法1和方法2,都出现错误提示standard in must be a tty。

这时候尝试寻找外部帮助,一个shell工具expect可以实现这个功能,其实expect就是一个专门用来实现自动交互功能的工具,expect的语法可以参考相关资料,代码如下:

   1. #!/usr/bin/expect 
   2. spawn su root 
   3. expect "password: " 
   4. send "123456/r" 
   5. expect eof 
   6. exit

测试通过,运行这个脚本,直接从当前用户登录到root用户。

七、方法总结

方法一(重定向)简单直观,也经常有实际应用,但是在自动交互领域功能有限。

方法二(管道)也很简单直观,有时甚至不用sleep配合就能展现强大的自动交互实力,但是在某些时候也束手无策。

方法三(expect)在功能上是最为强大的,expect本来就是为实现自动交互功能而生,但是缺点是需要安装expect包,在嵌入式等环境下难以安装。

三个方法各有优劣,应用的好,都可以完成Linux Shell自动交互。

 

 

********************************************

但是有时候我们可能会需要实现和交互程序如ftp,telnet服务器等进行交互的功能,这时候我们需要用到shell的自动交互功能.

  最简单的例子就是创建用户,我创建100个用户,初始密码为123,那么要是挨着passwd  username  ,交互性输入密码,那不得疯掉,但是脚本里应该

怎么写呢?将密码123,输入到passwd命令?

  本文收集了较常用交互方法,并进行了比较和总结。

  自动交互方法一:利用命令的自带参数,将标准输入作为手动输入的内容

  自动交互最关键的就是交互信息的自动输入,首先联想到文件重定向,在shell编程中有这样一种用法(参考Linux与UNIX SHELL编程指南 chapt

5.7):"command << delimiter  从标准输入中读入,直至遇到delimiter分界符。"

  重定向操作符command << delimiter是一种非常有用的命令,shell将分界符delimiter之后直至下一个同样的分界符之前的所有内容都作为输入,遇到

下一个分界符, shell就知道输入结束了。最常见的delimiter分界符是EOF,当然完全可以自定为其他字符。

  对于需求1 要求的自动登陆ftp,并作系列操作,则可以用这种方法进行自动交互。代码如下:

  [yjwan@test ~]$ ftp -i -n 192.168.21.46 <<EOF

  user dbftp dbftp101

  ls

  EOF

  下面是得到的结果:

  Connected to 192.168.21.46.

  220 developerjail FTP server (Version 6.00LS) ready.

  331 Password required for dbftp.

  230 User dbftp logged in.

  Remote system type is UNIX.

  Using binary mode to transfer files.

  229 Entering Extended Passive Mode (|||54281|)

  150 Opening ASCII mode data connection for '/bin/ls'.

  total 8847424

  -rw-r--r--  1 dbftp  www  9055318991 Aug 28 14:28 ewiz90.sql_2010-08-29

  226 Transfer complete.

  221 Goodbye.

  测试可以发现,如上代码使用帐号名dbftp,密码dbftp101成功登陆了ftp服务器,并进入目录,ls出当前目录的文件。

  注意事项:

  1  这里一定要加-i ,否则必定失败!!

  这里ftp用的-I 参数 结束了交互式输入,因此可以用文本的方式自动地输入用户密码以及操作方式

  如果不用-I 参数,那么必定要求你手动输入密码的!!那么就达不到自动登陆的要求了

  你可以man ftp找到这个参数

  -i 关闭多文件传送中的交互式提示。请参考 prompt、mget、mput 和 mdelete 子命令,以取得多文件传送中的提示的描述。

  -n 防止在起始连接中的自动登录。否则, ftp 命令会搜索 $HOME/.netrc 登录项,该登录项描述了远程主机的登录和初始化过程。请参考 user 子命

令。

  2    举一反三:只要是要求输入密码的命令,一般都带有一个参数,允许你从标准输入,输入用户密码,以及操作。

  其他常用的自动登陆命令的参数

  1)  Passwd命令

  Linux下 Passwd有参数

  --stdin

  This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.

  所以linux下自动改变用户密码的办法就是

  Echo 密码 |passwd –stdin 用户名

  Freebsd没有以上参数 注意

  他的方法是echo passwd |pw mod user username -h 0

  2)smbpasswd

  -s

  This option causes smbpasswd to be silent (i.e. not issue prompts)

  and to read its old and new passwords from standard input, rather

  than from /dev/tty (like the passwd(1) program does). This option

  is to aid people writing scripts to drive smbpasswd

  3)sudo

  在shell脚本中需要用root用的来执行指令:

  sudo 自动输入密码

  echo "password" | sudo -S netstat -tlnp

  -S

  The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.

  3  标准输入还可以用以下两种写法:

  可以将下面的内容写入到一个文本

  然后ftp  -I –n ip <文本

  或者echo  “..”  |ftp –I –n ip

  都是可以的!

  因为他们都满足“有一个标准的输入”这个条件

  4 ssh的自动登陆没有这样的自动输入密码的参数

  一般都是使用公钥/私钥的方式自动登录