1

我正在为学校做一个小项目。我正在使用 15 个左右的调谐器来模拟 Cell 网络。我还没有精通脚本。我是一名 EE,通常会在我有一些能够满足我的目的的 frankencode 之前使用谷歌搜索。

目标是快速设置所有模块,所以我想用脚本自动化这个过程。这需要 ssh,到目前为止,我每次都必须手动输入密码。今天早上我用 Expect 和 sshpass 设置了一个基本测试。在任何一种情况下,我都可以正确登录,但不能向远程机器发出指令。

我正在阅读 sshpass 发送远程指令有困难,如果我错了,请纠正我。

/usr/bin/expect << EOF
spawn ssh root@<IP>
expect "(yes/no)?" #Are you sure you want to connect nonsense
send "yes\r"
expect "password"
send "$pass\r"

我在这里尝试了一些方法来让设备接收指令

interact
cat /pathto/config.txt
#or
send "cat /pathto/config.txt
#the real goal is to send this instruction
sqlite3 /database.db "update table set param=X"


EOF
4

1 回答 1

0

您不妨将其设为期望脚本,而不是 shell 脚本

#!/usr/bin/expect -f

然后将 IP 地址作为命令行参数传递给脚本

expect myloginscript.exp 128.0.0.1 the_password

在期望脚本中,您将从参数列表中获取该 IP 地址

set ip [lindex $argv 0]
set pass [lindex $argv 1]

(将密码放在命令行上不是好的安全做法。您可以研究将密码传递给期望脚本的更好方法。)

要使用 ssh,您只会在第一次连接时被询问“您确定”,所以让我们有条件地这样做。这是通过让expect命令等待几个模式来完成的:

spawn ssh root@$ip
expect {
    "(yes/no)?" {
        send "yes\r"
        # continue to wait for the password prompt
        exp_continue
    }
    "password" {
        send "$pass\r"
    }
}

一旦发送,您应该会看到您的 shell 提示符。此模式取决于您自己的配置,但通常以散列和空格结尾。

expect -re {# $}

现在您可以自动化其余的命令:

send "cat /pathto/config.txt\r"
expect -re {# $}

# note the quoting
send "sqlite3 /database.db \"update table set param='X'\"\r"
expect -re {# $}

此时,您将要注销:

send "exit\r"
expect eof

另一方面,如果您设置 ssh 私钥身份验证(请参阅ssh-keygenssh-copy-id),您可以这样做:

ssh root@IP sqlite3 /database.db "update table set param='$X'"

并且完全不必期待。

于 2018-09-11T15:16:50.640 回答