获取 .bashrc 后,使用 ssh 在交互式 shell 中运行命令

获取 .bashrc 后,使用 ssh 在交互式 shell 中运行命令

我想通过 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 commandcommand将以非交互方式运行。

非交互式 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"'

但这似乎是一个非常复杂的方法。您还没有解释为什么需要这样做,但请考虑以下替代方案:

  1. 只需在远程计算机上启动正常登录交互式 shell 并手动运行命令即可:

    user@local $ ssh user@remote
    user@remote $ my_alias
    
  2. 如果您始终希望在连接到此计算机时运行该别名,请编辑远程计算机的~/.profile(或~/.bash_profile,如果存在)并在末尾添加以下行:

    my_alias
    

    因为~/.profile每次启动登录 shell 时都会读取(例如,每次通过 进行连接时ssh),这将导致my_alias每次连接时运行。

    请注意,默认情况下,登录 shell 会读取~/.profileor~/.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"

相关内容