通过 ssh 远程执行命令来使用别名

通过 ssh 远程执行命令来使用别名
shopt -s expand_aliases
ttmp="SUCCESS"
alias aliased_command='echo $ttmp'

我可以通过将以上行添加到 .bashrc 文件来远程使用别名。

[USER@REMOTESERVER ~]$ ssh MYSERVER aliased_command
SUCCESS

当 shell 非交互式时,别名不会展开,除非使用 shopt 设置 Expand_aliases shell 选项

expand_aliases选项允许非交互式 shell 使用别名。

但是,当我运行时:

[USER@REMOTESERVER ~]$ ssh MYSERVER echo $-
himBH

看来通过 ssh 运行远程命令正在使用交互式 shell。(i包含)

这是正确的吗?

如果正确,为什么需要 Expand_aliases 选项?

如果错误,如果ssh SERVER COMMAND使用非交互式 shell,为什么ssh MYSERVER COMMAND读取.bashrcMYSERVER 的文件时非交互式 shell 不读取.bashrc文件

cf) 引用命令会产生不同的输出

[USER@REMOTESERVER ~]$ ssh MYSERVER 'echo $-'
hBc

任何链接,评论赞赏。

答案1

至少有两个方面:

1. 引用

未加引号的内容$-由您扩展当地的壳。请注意,本地ssh可以根据它获取的多个参数构建 shell 代码(以在远程端运行)。当你这样做时ssh MYSERVER echo $-,远程 shell 就得到了echo himBH。该himBH字符串来自您的本地 shell。当你这样做时ssh MYSERVER 'echo $-',远程 shell 就得到了echo $-

如何通过 ssh 执行复杂的命令行以及我的回答。我不会在这里重复所有内容。最重要的事情:

为了控制远程 shell 将获得的内容$command_line_built_by_ssh,您需要理解、预测和策划之前发生的解析和解释。您需要制作本地命令,所以本地 shell 并消化它,它就变成了您想要在远程端执行的ssh确切内容。$command_line…

ssh一个好的方法是将精确的(远程)命令作为单个参数传递给本地。这就是您所做的ssh MYSERVER 'echo $-',单引号阻止了本地扩展。$-在远程 shell 的上下文中未加引号。

结果hBc来了从远程 shell。远程 shell 不是交互式的。

2. Bash 试图变得聪明

关于非交互式 shell 采购.bashrc,请参阅这是我的另一个答案:

第 2 个扭曲:Bash 尝试确定它何时在其标准输入连接到网络连接的情况下运行,就像由 SSH 服务器执行时一样。如果 Bash 确定它正在以这种方式运行,它会读取并执行来自 的命令~/.bashrc

您链接到bash 文档。我所说的是“由远程 shell 守护进程调用”。还有更多曲折,请参阅完整链接的答案。

相关内容