【问题标题】:Expect script SSH not successful期望脚本 SSH 不成功
【发布时间】:2015-04-22 05:27:20
【问题描述】:

我做了两个脚本:

这个获取 IP 地址和主机名:

#!/bin/bash
for i in `cat ~/script/hosts.txt`
do HOSTNAME=`echo $i|awk -F: '{print $1}'`
IP=`echo $i|awk -F: '{print $2}'`
TIMESTAMP=`date +%Y-%m-%d`
~/script/expect.sh $HOSTNAME $IP
done

这个是通过 SSH 连接到设备的:

#!/usr/bin/expect
set timeout 20
set HOSTNAME [lindex $argv 0]
set IP [lindex $argv 1]
exp_internal 1
spawn ssh -o StrictHostKeyChecking=no root@$IP
exit

我想制作一个脚本来 bakcup 多个设备配置。 问题是 SSH 由于以下错误而失败:

$ ./main.sh
spawn ssh -o StrictHostKeyChecking=no root@10.102.82.235
: Name or service not knownname 10.102.82.235
spawn ssh -o StrictHostKeyChecking=no root@10.102.82.239
: Name or service not knownname 10.102.82.239

当我调试时,我看到以下错误

spawn id exp4 sent <ssh: Could not resolve hostname 10.102.82.235\r\r: Name or                                                          
service not known\r\r\n>
: Name or service not knownname 10.102.82.235

我认为问题是由于这些字符造成的:“\r\r”、“\r\r\n” 有什么办法可以过滤掉这些吗?

【问题讨论】:

  • 为什么不使用 tr -d '\r\r' $IP 它会去掉回车
  • 放在哪里?我不擅长编程或脚本!
  • 您需要修复“hosts.txt”文件:它包含 DOS \r\n 行尾。使用dos2unix hosts.txt
  • @glennjackman 你是对的。我尝试转换,但转换后仍然包含下一行的返回字符。是否可以在 Expect 脚本中过滤输入?
  • 是的。 set hostname [regsub {\r$} [lindex $argv 0] ""]set ip ... 类似

标签: ssh expect


【解决方案1】:

不是答案,但你的 shell 脚本可以使用很多改进:

#!/bin/bash
while IFS=: read -r host ip; do
    timestamp=$(date +%Y-%m-%d %T)
    ~/script/expect.sh "$host" "$ip"
done <  ~/script/hosts.txt

注意事项:

  • 不要使用for line in `cat file` 来读取文件的行——for 循环会从文件中读取单词
  • 使用$(...) 进行命令替换,而不是`...` -- 提高了可读性,并且易于嵌套
  • 不要使用UPPERCASE_VARIABLES——这些应该留给shell使用。
  • 您的(未使用的)TIMESTAMP 变量实际上包含一个日期,没有时间。
  • 请引用您的 "$variables",除非您能解释为什么不希望引用它们。

【讨论】:

  • 感谢大家的帮助。脚本在 Linux 中完美运行。所以问题是由于 Cygwin 或 linux-windows 混合环境造成的。网络有一些限制,所以我不得不在 windows 而不是 linux 中运行它。
猜你喜欢
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 1970-01-01
  • 2019-05-14
  • 2015-06-27
  • 2017-06-11
相关资源
最近更新 更多