Linux无密码登陆及命令应答交互

一、Linux无密码登陆

  • a.通过设置KEY登陆(推荐)
    生成密钥:ssh-keygen
    安装密钥到远程主机:ssh-copy-id 用户名@主机地址
    注意:ssh-copy-id 将key写到远程机器的 ~/.ssh/authorized_key 文件中。

  • b.使用sshpass命令(需安装):
    sshpass -p "ssh密码" ssh 用户名@主机地址

  • c.使用plink工具连接(windows):
    plink.exe -pw "ssh密码" ssh 用户名@主机地址

二、Linux命令应答命令expect(需安装)

  • 1.expect简介
    expect 是用来进行自动化控制和测试的工具。主要是和交互式软件 telnet ftp passwd fsck rlogin ssh tip 等进行自动化的交互。

  • 2.expect关键命令

    send       //向进程发送字符串模拟用户的输入,注意一定要加 \r 回车  
    expect     //从进程接收字符串     
    spawn      //启动进程(由spawn启动的进程的输出可以被expect所捕获)     
    interact   //用户交互     
    
  • 3.expect使用
    单一分支语法:

    expect "hello" {send "you said hello"}
    

    当输出中包含hello后,输出you said hello
    多分支模式语法:

    expect {
          "lilei" {send "hello lilei"; exp_continue}
          "hanmeimei" {send "hello hanmeimei"; exp_continue}
          "how do you do ?" {send "how do you do"}
    }
    

    命令说明:
    当输出中包含lilei时 输出hello lilei,同时循环此多分支语句。
    当输出中包含hanmeimei时 输出hello hanmeimei,同时循环此多分支语句。
    当输出中包含how do you do ?时 输出dow do you do。

  • 4.使用实例

    • 远程登录服务器并创建文件夹

      #!/usr/bin/expect 
      set timeout -1
      spawn ssh root@192.168.0.107
      expect {
          "password" {send "123456\r";}
          "yes/no" {send "yes\r";exp_continue}
      }
      expect "root" {send "mkdir test\r"}
      expect eof
      exit
      
    • expect脚本获取参数:

      #!/usr/bin/expect 
      set ip [lindex $argv 0]
      set password [lindex $argv 1]
      set timeout -1
      spawn ssh root@$ip
      expect {
          "password" {send "$password\r";}
          "yes/no" {send "yes\r";exp_continue}
      }
      expect "root" {send "mkdir test1\r"}
      expect "root" {send "mkdir test2\r"}
      send "exit\r" //退出远程登录
      expect eof
      exit
      

      ./expect.ex 192.168.0.107 123456

    • 远程登录服务器等待手动操作:

      #!/usr/bin/expect 
      set ip [lindex $argv 0]
      set password [lindex $argv 1]
      set timeout -1
      spawn ssh root@$ip
      expect {
          "password" {send "$password\r";}
          "yes/no" {send "yes\r";exp_continue}
      }
      interact
      

      ./expect.ex 192.168.0.107 123456

    • 使用scp传输文件:

      #!/usr/bin/expect 
      set timeout -1
      spawn scp test.txt root@192.168.0.107:/home/
      expect {
          "password" {send "123456\r";}
          "yes/no" {send "yes\r";exp_continue}
      }
      expect eof
      exit
      
    • 在本地开启socks5的代理:

       #!/usr/bin/expect 
       set timeout -1 //expect匹配输出的超时时间
       spawn ssh -N -D 0.0.0.0:1080 localhost //新建一个进程,执行ssh命令
       expect {
          "yes/no" {send "yes\r";exp_continue} //
          "password" {send "123\r"}
       }
       expect eof
       exit
      

      命令说明:
      根据进程输出执行预先设置好的命令:
      假如输出包含yes/no,则表示是第一次登入需要输入yes来添加信任。exp_continue表示继续此循环。
      假如输出包含password,表示需要输入密码。
      expect eof是在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof即在等待这个标记,因为ssh -N -D 0.0.0.107:1080 localhost 程序需要一直运行,所以将timeout设置为-1即可无限制的等待。

    • 指定登陆机器
      从computerInfo里读取相应机器信息,用户选择登陆其中一台机器。
      computerInfo.txt内容:

      #ip port user password description          
      192.168.1.1 root 123456 'first machine'          
      192.168.1.2 root 123456 'second machine'          
      

      core.ex脚本内容:

      #!/usr/bin/expect 
      set ip [lindex $argv 0]
      set port [lindex $argv 1]
      set username [lindex $argv 2]
      set password [lindex $argv 3]
      set timeout -1
      spawn ssh -p $port $username@$ip
      expect {
          "password" {send "$password\r";}
          "yes/no" {send "yes\r";exp_continue}
      }
      interact
      

      login.sh脚本内容:

      #!/bin/bash
      file="computerInfo.txt"
      #显示机器信息 过滤第一行和空行
      awk '{if (NR > 1 && $1 != ""){printf "%-2s %-45s %-15s \n",NR")",$5,$1}}' $file 
      echo "please choose which machine to login:"
      read number
      #将信息存入变量
      read ip port user password <<< $(echo `awk 'NR=="'$number'"{print $1,$2,$3,$4}' $file`)
      ./core.ex $ip $port $user $password
      

参考文章:
Linux Expect 简介和使用实例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容