我想通过 ssh 连接到远程 Ubuntu 计算机,获取我的源.bashrc
并运行一个取决于该计算机设置的参数的命令.bashrc
。所有这些都在交互式 shell 中,命令完成后不会关闭。
到目前为止我尝试过的是
ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'
要不就
ssh user@remote_computer -t "my_alias;bash"
这适用于一般命令(例如ls
),但是当我尝试运行中定义的别名时,.bashrc
出现错误:
bash: my_alias: command not found
但是当我再次手动编写并运行它时,它起作用了!
.bashrc
那么如何在调用命令之前确保该命令的来源呢?
答案1
问题是您正在尝试在非交互式 shell 中运行别名。当您运行 时ssh user@computer command
,command
将以非交互方式运行。
非交互式 shell 不读取别名(来自 man bash):
当 shell 非交互式时,别名不会展开,除非使用 shopt 设置 Expand_aliases shell 选项(请参阅下面的 SHELL BUILTIN COMMANDS 下的 shopt 描述)。
如果您再次手动运行它,它就会起作用,因为最后的bash
命令会启动一个交互式 shell,因此您的别名现在可用。
作为替代方案,您可以在远程计算机上启动交互式 shell ( bash -i
) 而不是简单的登录 shell ( ) 来运行您的别名:bash -l
ssh user@remote_computer -t 'bash -ic "my_alias;bash"'
但这似乎是一个非常复杂的方法。您还没有解释为什么需要这样做,但请考虑以下替代方案:
只需在远程计算机上启动正常登录交互式 shell 并手动运行命令即可:
user@local $ ssh user@remote user@remote $ my_alias
如果您始终希望在连接到此计算机时运行该别名,请编辑远程计算机的
~/.profile
(或~/.bash_profile
,如果存在)并在末尾添加以下行:my_alias
因为
~/.profile
每次启动登录 shell 时都会读取(例如,每次通过 进行连接时ssh
),这将导致my_alias
每次连接时运行。请注意,默认情况下,登录 shell 会读取
~/.profile
or~/.bash_profile
并忽略~/.bashrc
。某些发行版(例如 Debian 及其衍生版本和 Arch),例如 Ubuntu,有其默认~/.profile
或~/.bash_profile
文件源~/.bashrc
,这意味着您定义的别名~/.bashrc
也可以在登录 shell 中使用。并非所有发行版都是如此,因此您可能需要~/.profile
手动编辑源代码~/.bashrc
。另请注意,如果~/.bash_profile
存在,~/.profile
将被 bash 忽略。
答案2
我必须注释 .bashrc 中防止使用别名的部分,并添加 Expand_aliases 命令。这条被评论了
# If not running interactively, don't do anything
#case $- in
# *i*) ;;
# *) return;;
#esac
并且添加了这个
if [ -z "$PS1" ]; then
shopt -s expand_aliases
fi
然后我的命令起作用了:
ssh user@remote_computer -t "my_alias;bash"