语境:
我正在编写一个脚本,监控 Brocade SAN 交换机上的所有 SFP,并需要遍历所有 FabricID 上下文。
当我通过 SSH 登录 FabricOS 8.2.2d(也带有 9.0.1)设备时输入:
setcontext <FID>
那么命令就会正常运行。
但是当(作为我的脚本的一部分)我尝试通过以下方式非交互地运行相同的命令时:
ssh <username@hostname> setcontext <FID>
然后我收到以下错误信息:
rbash: setcontext: command not found
让我感到困惑的是,其他命令(例如showsfp
,switchshow
(我打算在之后运行setcontext
))在两种情况下都有效。我不明白setcontext
这有什么特别之处,导致无法以非交互方式运行。
编辑:使用command -V
(的更多发现https://man.cx/command):
command -V sfpshow
sfpshow is hashed (/fabos/link_bin/sfpshow)
command -V setcontext
setcontext is a shell builtin
这可以解释为什么我可以运行前一个命令但不能运行后一个命令ssh
吗?
答案1
来自 ssh 手册:
如果指定了命令,它将在远程主机上执行,而不是在登录 shell 上执行。
登录 shell 将读取一些配置文件,这些文件通常会设置类似的变量$PATH
,因此当没有调用登录 shell 时,您通常会得到不同的环境。
rbash
表示这台机器上正在运行一个受限的 bash,因此-l
调用登录 shell 的 bash 参数应该起作用。
ssh <username@hostname> bash -l setcontext <FID>
另一个选择可能是使用完整路径setcontext
,因为它很可能$PATH
是缺少的变量。