Bash 自动执行SonicWall防火墙SSH会话的Shell脚本不工作

Bash 自动执行SonicWall防火墙SSH会话的Shell脚本不工作,bash,shell,ssh,expect,heredoc,Bash,Shell,Ssh,Expect,Heredoc,我正在尝试编写一个shell脚本(Bash)来登录到SonicWall防火墙设备,并发出一个命令来执行设备规则集的自动备份。我更喜欢在Bash中这样做,但我会接受python、perl、except或applescript解决方案。如果不能在bash中完成,请提及这一点 问题: 1.)防火墙上的SSH服务器是自定义的,在发出 $ ssh server.com 因此,无论您使用什么用户名,例如 $ ssh admin@server.com SSH服务器在运行后仍然显示用户名和密码框 2.)SS

我正在尝试编写一个shell脚本(Bash)来登录到SonicWall防火墙设备,并发出一个命令来执行设备规则集的自动备份。我更喜欢在Bash中这样做,但我会接受python、perl、except或applescript解决方案。如果不能在bash中完成,请提及这一点

问题:

1.)防火墙上的SSH服务器是自定义的,在发出

$ ssh server.com
因此,无论您使用什么用户名,例如

$ ssh admin@server.com
SSH服务器在运行后仍然显示用户名和密码框

2.)SSH服务器是最小的,我不能使用公钥

我尝试使用一个here文档,但它不起作用,它会立即导致“远程主机关闭连接”

我需要执行的命令的形式如下:

export preferences ftp "ftp.server.com" "user1" "mypassword" "output.exp"
连接给了我这个:

$ ssh admin@server.com


Copyright (c) 2010 SonicWALL, Inc. 

User:    
发出用户名后,会出现密码提示:

User:user1
Password:
我试过这里的文件,但没有用

$ ssh server <<+
user1
mypassword
export preferences ftp "ftp.server.com" "user1" "mypassword" "output.exp"
exit
+ 
Pseudo-terminal will not be allocated because stdin is not a terminal.
Connection to 10.1.1.1 closed by remote host.

$ssh server您可以使用原始的
expect
自动化ssh会话,下面是一篇详细讨论它的文章:或者Python模块
pexepect

您可以使用原始的
expect
自动化ssh会话,这里有一篇很好的文章详细讨论了它:或者Python模块
pexepect

我不是BASH专家,但我不得不做一些交互式密码提示给我带来问题的事情

基本上,您的脚本需要等待被要求输入登录凭据,并在提示登录时传递这些凭据,一旦登录,您就可以发出该命令

我建议查看生成“预期”会话。基本上,在脚本中,您使用expect来表示“我希望看到密码:在响应中,当我看到密码时,我需要传入以下数据”

这是一个维基页面,可以帮助解释它


如果你在谷歌上搜索,你会发现很多帮助。

我不是BASH专家,但我不得不做一些交互式密码提示给我带来问题的事情

基本上,您的脚本需要等待被要求输入登录凭据,并在提示登录时传递这些凭据,一旦登录,您就可以发出该命令

我建议查看生成“预期”会话。基本上,在脚本中,您使用expect来表示“我希望看到密码:在响应中,当我看到密码时,我需要传入以下数据”

这是一个维基页面,可以帮助解释它


如果你到处搜索,你会发现很多帮助。

正如其他人所建议的,
expect
可能是你在这里想要使用的

下面是一个简短的示例,介绍如何从
bash
开始使用它:

login=root
IP=127.0.01
password=helloworld
# +whatever variables you need to use

# Run the expect script from bash
expect_sh=$(expect -c "
spawn ssh $login@$IP
expect \"password:\"
send \"$password\r\"
expect \"#\"
send \"cd $dest_dir\r\"
expect \"#\"
send \"chmod +x $server_side_script $other_script\r\"
expect \"#\"
send \"./$device_side_script\r\"
expect \"#\"
send \"cat results_file\r\" 
expect \"#\"
send \"exit\r\"
")

# Output or do something with the results
echo "$expect_sh"

正如其他人所建议的,
expect
可能是您在这里想要使用的

下面是一个简短的示例,介绍如何从
bash
开始使用它:

login=root
IP=127.0.01
password=helloworld
# +whatever variables you need to use

# Run the expect script from bash
expect_sh=$(expect -c "
spawn ssh $login@$IP
expect \"password:\"
send \"$password\r\"
expect \"#\"
send \"cd $dest_dir\r\"
expect \"#\"
send \"chmod +x $server_side_script $other_script\r\"
expect \"#\"
send \"./$device_side_script\r\"
expect \"#\"
send \"cat results_file\r\" 
expect \"#\"
send \"exit\r\"
")

# Output or do something with the results
echo "$expect_sh"

那对我不起作用

我必须在启动时将变量传递给脚本

示例启动脚本login2.sh,包含三个参数:


-bash-4.1$./login2.sh Jan2****HIE_SUPER 10.244.112.182

这对我来说不起作用

我必须在启动时将变量传递给脚本

示例启动脚本login2.sh,包含三个参数:


-bash-4.1$./login2.sh Jan2****HIE_SUPER 10.244.112.182

有人知道bash是否可以做到这一点吗?有人知道bash是否可以做到这一点吗?感谢您提供一个与我需要的非常吻合的示例。这应该是一件轻而易举的事了。谢谢你给我举了一个非常符合我需要的例子。这应该是轻而易举的事了。我想等待才是问题所在。谢谢分享。我想等待才是问题所在。谢谢分享。