我尝试用expect
脚本尝试连接ssh
,并查看是否可以(良好密码和可访问)。我试图将结果放入变量,但只记录了 stdout 的末尾,而不是所有 stdout 。我该怎么办?
result=$(
(/usr/bin/expect << EOF
spawn ssh $username@$ip -o StrictHostKeyChecking=no
set timeout 2
expect ":"
send -- "$password\r"
expect ">"
send -- "show clock\r"
expect ">"
EOF
) 2>&1)
谢谢。
答案 0 :(得分:3)
如果您尝试使用ssh
自动将命令发送到其他服务器:
生成ssh
密钥,而不是使用密码:
ssh-keygen -t rsa -b 2048
将其复制到服务器:
ssh-copy-id id@server
现在您无需担心密码。 ssh
个密钥充当密码,通常很多更安全。有关ssh
键的详细信息,请参阅这些(SSH login without password,Why is using SSH key more secure than using passwords?)。
然后您可以使用此命令 - 不需要expect
,因为不会要求您输入密码。它将使用您的ssh
密钥。我的位于~/.ssh/id_rsa
。所以:
ssh id@server -i ~/.ssh/id_rsa "show clock;"
-i
代表身份文件,即您的ssh
密钥文件。将向SSH服务器发送命令。
现在:
ssh-keygen -t rsa -b 2048
ssh-copy-id id@server
ssh id@server -i ~/.ssh/id_rsa "show clock;"
三个命令,你已经完成了!
答案 1 :(得分:0)
expect "/copySSHKey.exp <machine> <password> </.ssh/id_rsa.pub path>"
#!/usr/bin/expect -f
set machine [lrange $argv 0 0]
set ip [lrange $argv 1 1]
set pass [lrange $argv 2 2]
set path [lrange $argv 3 3]
set timeout -1
spawn ssh-keygen -R ${machine}
spawn ssh-copy-id -i ${path} root@${machine}
match_max 100000
expect {
sleep 10
"password" {
send -- "$pass\r"
send -- "\r"
sleep 1
send_user " SSH key copied to $machine\n"
}
"$machine's" {
send_user " SSH key copied to $machine\n"
}
"password:*" {
send -- "$pass\r"
send -- "\r"
sleep 1
send_user " SSH key copied to $machine\n"
}
"machine" {
sleep 1
send_user " SSH key copied to $machine\n"
}
}
interact
答案 2 :(得分:-1)
尝试使用双引号(&#34;)来捕获子shell的输出。由于解析问题,您可能会丢失数据:
result="$( ... )"