ssh会话中的sh脚本未返回值
我有下面的sh脚本代码,它通过SSH访问我的本地路由器,以便找到路由器的真实IP地址(与VPN创建的明显IP相比) 代码正常工作,我没有收到任何错误,但它没有返回我期望的字符串,即“External IP isssh会话中的sh脚本未返回值,ssh,sh,Ssh,Sh,我有下面的sh脚本代码,它通过SSH访问我的本地路由器,以便找到路由器的真实IP地址(与VPN创建的明显IP相比) 代码正常工作,我没有收到任何错误,但它没有返回我期望的字符串,即“External IP is99.99.99” 如果我在终端(ssh、getrealip.sh和echo)中分别执行这3个命令中的每一个,它就可以正常工作 有人知道我在这里错过了什么吗 在Mac OS上运行脚本访问Asus路由器。脚本将从文本栏项运行 #!/bin/sh myip=$(ssh admin@192.1
99.99.99
”
如果我在终端(ssh、getrealip.sh和echo)中分别执行这3个命令中的每一个,它就可以正常工作
有人知道我在这里错过了什么吗
在Mac OS上运行脚本访问Asus路由器。脚本将从文本栏项运行
#!/bin/sh
myip=$(ssh admin@192.168.1.1 'myip=$(/usr/sbin/getrealip.sh); echo $myip')
echo "$myip"
exit
应导致“外部IP为
99.99.99.99
”字符串,但实际上返回空值。我很抱歉没有最有用的答案,但根据我的经验,”
会逐字解释字符串值。你会得到这样的结果:
bash-4.3# echo '$(hostname -I)'
$(hostname -I)
尝试将“
字符替换为”
另外,请注意,ssh调用之前会解释子shell。因此,您的电脑将在连接到路由器之前尝试运行脚本
也许我没有正确理解这个问题,但是如果SSH版本使用-t
选项,您甚至可能不需要subshell.IDK。但是我建议您将SSH命令更改为
myip=$(ssh admin@192.168.1.1 -t "sh /usr/sbin/getrealip.sh;")
谢谢你的输入。我确实尝试了你建议的mods,但不幸的是它返回了相同的空结果。顺便说一句,ssh调用上-t选项的目的是什么?从ssh手册页,它将
强制伪tty分配。这可用于在远程机器上执行任意基于屏幕的程序。
。因此它不是必需的。我忽略它在开始的时候使用sh
,考虑运行脚本中的任何命令。此外,还有一些curl命令也可以。谢谢,不幸的是curl命令只返回明显的IP(VPN提供的IP),而不是真正的IP,这正是路由器上的sh所要做的。我会继续插拔!我不明白为什么它不工作,但为什么不简化,即myip=$(sshadmin@192.168.1.1'/usr/sbin/getrealip.sh)
?现在最好的调试方法是在本地脚本的顶部添加set-vx
,如果这不能解决问题,也可以添加到getrealip.sh
。祝你好运。谢谢。我简化了,但没有帮助。不幸的是,set-vx也没有提供任何细节。getrealip.sh是ASUS so提供的路由器上的脚本不确定我能做多少。制作两个cmd,sshadmin@192.168.1.1'/usr/sbin/getrealip.sh;myip=$(ssh)admin@192.168.1.1'/usr/sbin/getrealip.sh)
。从本地脚本内部运行时,第一次调用ssh的裸输出是什么?祝您好运。下面是我得到的结果…主机“192.168.1.1”不在受信任的主机文件中。(ecdsa-sha2-nistp521指纹sha1!!26:4a:dc:f9:19:53:67:1f:fd:de:e2:af:19:c7:e7:c1:13:34:3f:a8)是否继续连接?(y/n)Yadmin@192.168.1.1的密码:admin@192.168.1.1密码:XXXXXXXXX现在您必须弄清楚如何使路由器不需要密码,或者安装expect
,以便您可以将密码作为脚本的一部分发送进来,或者使用ssh选项从本地文件读取密码以发送进来。抱歉,我不记得这是什么,但是它确实存在。这里有很多关于最后两个主题的问答,对“无密码”选项不太确定,这是一种安全风险,可能是路由器操作系统特有的(ish)。祝你好运