我尝试编写一个 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)
此代码运行不正常,仍然要求输入密码。有人可以帮我解决这个问题吗
$ 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)
去了哪9里10?
$ 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) 我在 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开始工作。)
我使用的是 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) 我需要使用期望脚本在 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
我的问题是:
foo还是盒子会崩溃?不幸的是,我在公司生产环境中运行,所以我不能完全尝试看看会发生什么。
我从下面的 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 工具对我的密码进行了硬编码。我不想做这件事。
如何从我的文件中删除以下字符序列?^[[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) 我正在尝试编写一个脚本,该脚本从 .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) 我正在尝试使用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 中并能够发出命令。
知道我在这里缺少什么吗?
我在编写期望脚本时遇到困难。我想做一些相当于以下 bash 指令的事情:
iplist=$(cat iplist.txt)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过使用set我所知道的所有方法,但仍然不起作用。还有其他方法还是只是我没有以正确的方式使用它?
set iplist=$(cat iplist.txt)
Run Code Online (Sandbox Code Playgroud)