采购.bashrc之后,使用ssh在交互式shell中运行命令


11

我想ssh进入远程Ubuntu计算机,获取我的源文件.bashrc并运行取决于该计算机设置的参数的命令.bashrc。交互式外壳中的所有内容在命令完成后不会关闭。

我到目前为止尝试的是

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在调用命令之前确保的来源?


该帖子令人困惑。我建议不要滥用这样的运行命令;然而,如果bash或bash命令被调用,我会说.bashrc应该运行。显然,运行这样的命令存在一些差异或特性,对于更严重的应用程序,我建议使用Ansible或puppet。
Rui F Ribeiro

我编辑了问题。第二个命令更简单并且执行相同的操作,但是之前仍然没有采购.bashrc。
Mehdi

@RuiFRibeiro滥用吗?你怎么称呼这种简单的东西滥用?使用ssh登录到远程计算机后自动运行命令,就这么简单。部署用于此类可笑的小任务的任何外部工具都是过大的杀伤力
Mehdi 2015年

1
只是说一个数字,并不打算在更广泛的范围内使用。在需要时使用它们,但是使用它们似乎并不和平。尽管如此,对于将来的参考,请看一下Ansible,您会惊讶于它实际上是多么轻巧。我经常通过ssh运行命令。
Rui F Ribeiro

Answers:


9

问题是您正在尝试在非交互式外壳中运行别名。当您运行时ssh user@computer commandcommand将以非交互方式运行。

非交互式外壳不读取别名(来自man bash):

如果外壳不是交互式的,则别名不会扩展,除非使用shopt设置expand_aliases shell选项(请参阅下面的SHELL BUILTIN COMMANDS下的shopt的说明)。

如果您再次手动运行它,它将起作用,因为最终bash命令将启动交互式外壳程序,因此您的别名现在可用。

或者,您可以在远程计算机上启动交互式外壳程序(bash -i)而不是简单的登录外壳程序(bash -l)来运行别名:

ssh user@remote_computer -t 'bash -ic "my_alias;bash"'

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

  1. 只需在远程计算机上启动普通的登录交互式外壳程序并手动运行命令:

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

    my_alias

    因为~/.profile每次启动登录外壳程序(ssh例如,每次通过进行连接)都会读取一次,所以它将导致my_alias每次连接时运行。

    请注意,默认情况下,登录shell读取~/.profile~/.bash_profile忽略~/.bashrc。诸如Ubuntu之类的某些发行版(例如Debian及其衍生版本和Arch)具有默认~/.profile~/.bash_profile文件源~/.bashrc,这意味着您定义的别名~/.bashrc也将在登录Shell中可用。并非所有发行版都如此,因此您可能必须~/.profile手动进行编辑才能使其具有source ~/.bashrc。还要注意,如果~/.bash_profile存在,~/.profilebash将忽略它。


因此,您是否建议在alias_profile中定义别名,然后从.profile或.bash_profile中调用它们?
Mehdi

@Mehdi将取决于您要执行的操作。在您的Ubuntu系统上,系统~/.basyrc会自动读取~./profile,因此中定义的任何别名~/.bashrc也将可用于任何shell读取~/.profile。要使此功能正常工作,您真正需要做的就是明确启动一个交互式shell(-i)。
terdon

5

我必须注释.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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.