Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ssh会话中的sh脚本未返回值_Ssh_Sh - Fatal编程技术网

ssh会话中的sh脚本未返回值

ssh会话中的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

我有下面的sh脚本代码,它通过SSH访问我的本地路由器,以便找到路由器的真实IP地址(与VPN创建的明显IP相比)

代码正常工作,我没有收到任何错误,但它没有返回我期望的字符串,即“External IP is
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)。祝你好运