因为要对客户方的快30个项目进行特别有顺序的重启,所以不得不想办法写个脚本,网上看了不少段子。真是残缺的可以。没有一段是可以正常运行的。我来按顺序记录一下


脚本的本身


使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。
  脚本代码如下:
  ##############################################
  #!/usr/bin/expect
  set timeout 30
  spawn ssh -l username 192.168.1.1
  expect "password:"
  send "ispass\r"
  interact
  ##############################################
  1. [#!/usr/bin/expect]
  这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。
  注意:这一行需要在脚本的第一行。
  2. [set timeout 30]
  基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒
  3. [spawn ssh -l username 192.168.1.1]
  spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。
  它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
  4. [expect "password:"]
  这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒
  5. [send "ispass\r"]
  这里就是执行交互动作,与手工输入密码的动作等效。
  温馨提示: 命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下。
  6. [interact]
  执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行
  #!/usr/bin/expect #注意安装的路径,不确定 whereis expect 一下
  # Change a login shell to bash
  set user [lindex $argv 0]
  spawn bash $user
  expect "]:"
  send "/bin/bash " 



然后问题就来了。

首先要安装

#apt-get install expect  或是 yum install expect


然后,上面的脚本使用sh命是无法运行的,这点一定要记住,不然会报如下:


start.sh: line 3: spawn: command not found
": no such file or directory:
start.sh: line 5: send: command not found
start.sh: line 6: interact: command not found


解决的办法如下:

含有expect的脚本不能用bash执行,bash无法解析。添加可执行权限后,直接./your_script即可。

然后问题又来了,它会报 /usr/bin/expect^M: bad interpreter: 没有那个文件或目录

这时要这么办:

运行脚本时出现了这样一个错误,打开之后并没有找到所谓的^M,查了之后才知道原来是文件格式的问题,也就是linux和windows之间的不完全兼容。。。
具体细节不管,如果验证:

vim test.sh
:set ff?
如果出现fileforma=dos那么就基本可以确定是这个问题了。
:set fileformat=unix
:wq

OK了。。。。。。。


bash: ./eth0-access: /bin/bash^M: bad interpreter: 没有那个文件或目录

错误分析:

因为操作系统是windows,我在windows下编辑的脚本,所以有可能有不可见字符。

脚本文件是DOS格式的, 即每一行的行尾以 来标识, 其ASCII码分别是0x0D, 0x0A.

可以有很多种办法看这个文件是DOS格式的还是UNIX格式的, 还是MAC格式的

解决方法:

vim filename

然后用命令

:set ff? #可以看到dos或unix的字样. 如果的确是dos格式的。

然后用

:set ff=unix #把它强制为unix格式的, 然后存盘退出。

再次运行脚本。

好累,终于写完了。



用了一天的时间,linux下expect实现ssh自动登录服务器记,鄙视下网上各种抄来抄去残段子的更多相关文章

  1. linux expect详解(ssh自动登录)

    shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh root@192.168.22.194 expect "*password:&quo ...

  2. Windows 7下 搭建 基于 ssh 的sftp 服务器

    Windows  xp 下 搭建 基于  ssh 的sftp 服务器,服务器端可以用 freesshd,F-secure server等,filezilla server不可用,之前傻乎乎的用file ...

  3. Linux实现利用SSH远程登录服务器详解

    Linux实现利用SSH远程登录服务器详解 http://www.111cn.net/sys/linux/55152.htm

  4. 用了一天的时间,linux下expect实现ssh自己主动登录server记,歧视下网上各种抄来抄去残段子

    由于要对客户方的快30个项目进行特别有顺序的重新启动,所以不得不想办法写个脚本,网上看了不少段子.真是残缺的能够. 没有一段是能够正常运行的.我来按顺序记录一下 脚本的本身 使用expect实现自己主 ...

  5. linux下ssh远程登录服务器入门操作

    使用用户名密码登录 在命令行中输入命令: ssh username@ip_address -p port 之后系统会提示输入密码,输入后即可登录 如果不添加-p选项,则默认是22端口 还可以使用-l选 ...

  6. Linux学习笔记总结--ssh认证登录

    原理简介 SSH证书认证登录的基础是一对唯一匹配密钥: 私钥(private key)和公钥(public key).公钥用于对数据进行加密,而且只能用于加密.而私钥只能对使用所匹配的公钥,所加密过的 ...

  7. [转] windows 上用程序putty使用 ssh自动登录Linux(Ubuntu)

    需求: 在Win7电脑上使用putty(一种ssh客户端)连接Ubuntu 工具: puttygen.exe 和 putty.exe 第一步:生成密匙 运行puttygen.exe,选择需要的密匙类型 ...

  8. 在window系统下搭建基于ssh的git服务器

    以下是基于window server 2012搭建的,学习搭建过程需要很多问题,找了许多文章做了一下总结. 1.所需的软件 Git for Windows: MsysGit(Git-1.7.4-pre ...

  9. Linux开机以root账户自动登录

    最近我们的自动化测试平台需要支持中标麒麟系统,对于我们来说要让这个系统支持分布式自动化测试,最重要的一点就是虚拟机启动后自动以root账户登录系统,并且执行我们的环境配置脚本,那么如何能让它开启自动登 ...

随机推荐

  1. hdu 5750 Dertouzos 素数

    Dertouzos Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total ...

  2. POJ 2289(多重匹配+二分)

    POJ 2289(多重匹配+二分) 把n个人,分到m个组中.题目给出每一个人可以被分到的那些组.要求分配完毕后,最大的那一个组的人数最小. 用二分查找来枚举. #include<iostream ...

  3. ●BOZJ 4456 [Zjoi2016]旅行者

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4456 题解: 分治好题.大致做法如下:对于一开始的矩形区域,过较长边的中点把矩形区域分为两个 ...

  4. ●BZOJ 1855 [Scoi2010]股票交易

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1855 题解: DP,单调队列优化.(好久没做 DP题,居然还意外地想出来了) 定义 dp[i ...

  5. 例10-7 uva10820(欧拉)

    题意:输入n,要求满足1≤x,y≤n,且x,y互素的个数. 若输入2,则答案3为(1,1),(1,2),(2,1);所以欧拉函数求出所有数的phi值,除了1之外都加上phi值的2倍即可 通过推导: p ...

  6. 安装MySQL后出现发生系统错误2或者系统找不到指定的文件

    就是出现如下图所示的情况: 上图中画横线的地方可以看出,sql服务确实安装了.出现这种情况的原因就是服务的默认目录与sql文件的安装目录不一致.这里我个人的MySQL安装路径为D:\mysql-5.7 ...

  7. (转)Ensemble2015安装

    1 IIS安装和windows系统配置 1.1 IIS安装 检查是否安装好了IIS,可在[管理工具]的[服务管理器]中查看,如下图所示表示安装了IIS.   确认IIS已完全安装,点击上图中的Web服 ...

  8. Python中模块之queue的功能介绍

    模块之queue的功能介绍 队列的分类: 队列主要要分为两种 1.双向队列 2.单项队列 1. 单项队列 创建单项队列 格式:queue.Queue(obj) 例如:que = queue.Queue ...

  9. JVM内部原理

    这篇文章详细描述了Java虚拟机的内在结构.下面这张图来自<The Java Virtual Machine Specification Java SE 7 Edition>,它展示了一个 ...

  10. nodeppt的使用教程

    为什么选择nodeppt 这可能是迄今为止最好的网页版演示库 基于GFM的markdown语法编写 支持html混排,再复杂的demo也可以做! 支持多个皮肤:colors-moon-blue-dar ...