通过 ssh 在远程服务器上执行本地别名

通过 ssh 在远程服务器上执行本地别名

我知道我可以通过 SSH 在远程服务器上执行一个函数,如下所示:

$ ssh remote_server "$(declare -f cool_function); cool_function"

我还有一些别名,我想在远程服务器上执行它们,而不必在远程服务器上的任何文件上定义它们,这样我就可以将所有函数和别名放在一个地方并在任何远程 SSH 服务器上使用它们。

我认为这会起作用:

$ alias very_cool_alias='echo A very cool alias'
$ very_cool_alias
A very cool alias
$ ssh remote_server "$(alias very_cool_alias);very_cool_alias"
bash: very_cool_alias: command not found

尽管如果我检查别名,别名就在那里:

$ ssh remote_server "$(alias very_cool_alias);alias"
alias very_cool_alias='echo A very cool alias'

为什么函数有效但别名无效,尽管如最后一个例子所证明的那样,它已传递给远程 SSH 服务器?你知道我遗漏了什么吗?或者我该如何实现这一点?

我也尝试设置 expand_aliases 选项但仍然得到command not found

ssh remote_server "shopt -s expand_aliases;$(alias some_alias);some_alias"    

答案1

外壳手册 告诉我们:

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

然而它也提到

有关别名的定义和使用的规则有些令人困惑。Bash 总是先读取至少一整行输入,然后再执行该行上的任何命令。别名是在读取命令时展开的,而不是在执行命令时展开的。

这可以在本地进行测试:(ssh 正在bash -c远程调用):

$ bash -c "shopt -s expand_aliases; shopt expand_aliases;alias x=ls; x"
expand_aliases  on
bash: x: command not found

它确实有助于使其成为多行:

$ bash -c "shopt -s expand_aliases; alias x='echo y'
> x"
y

这也适用于 ssh。

答案2

您可能应该同步包含您喜欢的别名的 .profile、.bash_profile 和/或 .bashrc 文件。为了方便起见,我建议使用 rsync。

相关内容