标签: expect

用于登录 ssh 服务器的 Shell 脚本

我尝试编写一个 shell 脚本,它可以使用脚本中提到的密码自动登录到 ssh 服务器。我编写了以下代码:

set timeout 30
/usr/bin/ssh -p 8484 root@172.31.72.103
expect 
{
   "root@172.31.72.103's password" 
   {
      send "password\r" 
   }
}
Run Code Online (Sandbox Code Playgroud)

此代码运行不正常,仍然要求输入密码。有人可以帮我解决这个问题吗

password ssh expect

34
推荐指数
5
解决办法
28万
查看次数

为什么 unbuffer -p 会破坏其输入?

$ seq 10 | unbuffer -p od -vtc
0000000   1  \n   2  \n   3  \n   4  \n   5  \n   6  \n   7  \n   8  \n
Run Code Online (Sandbox Code Playgroud)

去了哪910

$ printf '\r' | unbuffer -p od -An -w1 -vtc
  \n
Run Code Online (Sandbox Code Playgroud)

为什么\r改为\n

$ : | unbuffer -p printf '\n' | od -An -w1 -vtc
  \r
  \n
$ unbuffer -p printf '\n' | od -An -w1 -vtc
  \r
      \n
Run Code Online (Sandbox Code Playgroud)

搞什么?

$ printf foo | unbuffer -p cat …
Run Code Online (Sandbox Code Playgroud)

buffer expect

18
推荐指数
1
解决办法
1331
查看次数

bash 脚本错误 stty:标准输入:设备的 ioctl 不合适

我在 bash 脚本中使用 here-documents 来自动安装和设置,其中多次需要密码。我输入密码一次,脚本将其传递给各种命令。在大多数情况下,here-document 方法可以很好地处理这个问题。但是,在一种情况下,我收到此错误:

Enter VNC password: stty: standard input: Inappropriate ioctl for device
Verify password:    
stty: standard input: Inappropriate ioctl for device
Run Code Online (Sandbox Code Playgroud)

请注意,此错误消息来自x11vnc -storepassword(而非来自sudo.)

我的问题x11vnc -storepasswd与这里有关,这是我的代码:

sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC
password
password
y
ENDDOC
Run Code Online (Sandbox Code Playgroud)

这显然(来自错误)不起作用。我很感激如何sudo x11vnc -storepasswd ~/.vnc/passwd在脚本中实现的工作示例。

如果有帮助,提示如下所示:

输入 VNC 密码:
验证密码:
将密码写入 /home/user/.vnc/passwd? [年]/年

使用expect会是更好的解决方案吗?如果是这样,在这种情况下我将如何使用它?(我以前从未使用expect过,但自从发布这个问题以来我看过很多例子,我无法自己expect开始工作。)

bash shell-script expect here-document

17
推荐指数
2
解决办法
8万
查看次数

spawn - 未找到命令!

我使用的是 Mac OS X 10.9.4,以下是我将文件从本地机器复制到不同主机的脚本

#!/bin/bash
#!/usr/bin/expect

echo "I will fail if you give junk values!!"
echo " "
echo "Enter file name: "
read filePath
echo " "
echo "Where you want to copy?"
echo "Enter"
echo "1. if Host1"
echo "2. if Host2"
echo "3. if Host3"
read choice
echo " "
if [ $choice -eq "1" ]
then
  spawn scp filePath uname@host1:/usr/tmp   
  expect "password"   
  send "MyPassword\r"
  interact
elif [ $choice -eq "2" ]
then
  spawn scp filePath …
Run Code Online (Sandbox Code Playgroud)

bash shell-script expect

17
推荐指数
2
解决办法
10万
查看次数

如果我开始过多的后台工作会怎样?

我需要使用期望脚本在 700 个网络设备上做一些工作。我可以按顺序完成,但到目前为止运行时间约为 24 小时。这主要是由于建立连接所需的时间以及这些设备(旧设备)的输出延迟。我能够建立两个连接并让它们并行运行就好了,但是我能推多远呢?

我不认为我可以一次完成所有 700 个,肯定有一些限制。我的 VM 可以管理的 telnet 连接数。

如果我确实尝试在这样的某种循环中启动其中的 700 个:

for node in `ls ~/sagLogs/`; do  
    foo &  
done
Run Code Online (Sandbox Code Playgroud)

  • CPU 12 个 CPU x Intel(R) Xeon(R) CPU E5649 @ 2.53GHz

  • 内存 47.94 GB

我的问题是:

  1. 所有 700 个实例可能同时运行吗?
  2. 在我的服务器达到极限之前我还能走多远?
  3. 当达到该限制时,它会等待开始下一次迭代foo还是盒子会崩溃?

不幸的是,我在公司生产环境中运行,所以我不能完全尝试看看会发生什么。

bash telnet jobs expect background-process

13
推荐指数
3
解决办法
6104
查看次数

我可以通过分配一些伪 TTY 以交互方式从 Dockerfile 构建 Docker 容器吗?

我从下面的 Dockerfile 构建容器:

FROM ubuntu:14.04
...
RUN apt-get update && apt-get install -y vim
#RUN ssh-keygen -f /root/.ssh/id_rsa -N strongpass123$%^
RUN ssh-keygen -f /root/.ssh/id_rsa
...
Run Code Online (Sandbox Code Playgroud)

我很少这样做,但是在使用之前ssh-keygen和之后有很多命令。

我知道我可以从脚本开始docker exec -it thirsty_darwin sh script.sh,然后标记图像,然后使用容器(图像)链接,但这并不是我想要的清晰解决方案。

甚至最坏的情况是ssh-add ~/.ssh/id_rsa当我必须使用 expect 工具时。Expect 工具对我的密码进行了硬编码。我不想做这件事。

ssh expect ssh-keygen docker

12
推荐指数
1
解决办法
9140
查看次数

从预期日志中删除不可打印的字符?

如何从我的文件中删除以下字符序列?^[[64;8H, ^[[?25h,^[[1;64r等或避免首先添加它们?

背景:

我正在为某些任务使用一组期望脚本。

我收集的输出文件通常包含上述类型的字符(如 emacs / vi / cat -v 中所示)。我已经尝试了一些像下面这样的 tr 命令,但它只使 [64;8H 等可见。

tr -dc '[:print:]\n' < input
Run Code Online (Sandbox Code Playgroud)

编辑:

上面的结果在一条有问题的线上

[1;64r[64;1H[64;1H[2K[64;1H[?25h[64;1H[64;.....
Run Code Online (Sandbox Code Playgroud)

bash expect tr

9
推荐指数
1
解决办法
7288
查看次数

bash 和 expect 在同一个脚本中?

我正在尝试编写一个脚本,该脚本从 .csv 文件中获取 IP 地址并远程登录设备以捕获“显示版本”命令输出。

到目前为止,我已经编码了这个:

#!/bin/bash
#!/usr/bin/expect -f
FILE1=dispositivos.csv  #file with IP's and device name
set Username "user"    #this is the user for telnet connection.
set Password "this.is.the.pass"  #pass for telnet connection.

NUMERODISP="$(wc -l $FILE1 | awk '{print $1}')" #this command counts number of devices (IP's) in the file as it is a .csv file, it only counts number of lines.


for i in `seq 2 $NUMERODISP`; 
        do
    IP="$(awk -vnum="$i" 'NR == num { print $NF }' dispositivoss.csv)"
        echo …
Run Code Online (Sandbox Code Playgroud)

scripting bash shell-script expect

9
推荐指数
1
解决办法
2万
查看次数

为什么expect的交互命令不起作用?

我正在尝试使用expect自动化gdb。我的脚本将启动 gdb,进行一些初始化,然后将控制权传递给用户。Expect 的interact命令似乎是完成这项工作的完美工具。

现在考虑:

$ echo "spawn gdb
    expect \"(gdb) \"
    send \"help\r\"
    expect \"(gdb) \"
    interact" | expect -
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这个脚本生成 gdb,按预期发出帮助命令。但随后它立即退出脚本并将我返回到 bash 提示符。我希望用户留在 gdb 中并能够发出命令。

知道我在这里缺少什么吗?

scripting expect

8
推荐指数
1
解决办法
5782
查看次数

如何使用“expect”将文件内容读入变量?

我在编写期望脚本时遇到困难。我想做一些相当于以下 bash 指令的事情:

iplist=$(cat iplist.txt)
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用set我所知道的所有方法,但仍然不起作用。还有其他方法还是只是我没有以正确的方式使用它?

set iplist=$(cat iplist.txt)
Run Code Online (Sandbox Code Playgroud)

linux shell-script expect

8
推荐指数
2
解决办法
1万
查看次数