ssh command execution doesn't consider .bashrc | .bash_login | .ssh/rc?
我正在尝试通过ssh远程执行命令,例如:
1 | ssh <user>@<host> <command> |
需要执行的命令是一个别名,它在.bashrc中定义,例如
1 | alias ll='ls -al' |
因此,最后应该执行以下命令:
1 | ssh user@host"ll" |
我已经发现了这一点。bashrc只能通过交互式shell获得源代码,所以在.bash_login中我输入:
1 2 3 | if [ -f ~/.bashrc ]; then . ~/.bashrc fi |
我还尝试在.bash_登录中直接定义别名。
我还尝试将.bash rc的别名定义/源代码放在.bash_概要文件和.ssh/rc中。但这些都不起作用。注意,我无法更改如何调用ssh命令,因为这是一些二进制安装脚本的一部分。我唯一能修改的就是环境。在执行ssh命令时,是否还有其他可能获得这个别名的来源?是否有一些ssh配置需要修改?
从bash的手册页:
Aliases are not expanded when the shell is not interactive, unless the
expand_aliases shell option is set usingshopt
有几种方法可以做到这一点,但最简单的方法是将以下行添加到您的
1 | shopt -s expand_aliases |
而不是:
1 | ssh user@host"bash -c ll" |
尝试:
1 | ssh user@host"bash -ic ll" |
强制bash使用"交互式shell"。
编辑:
正如这里所指出的,关于非交互式外壳。
1 2 3 | # If not running interactively, don't do anything [ -z"$PS1" ] && return # execution returns after this line |
现在,对于您的bashrc文件中的每个别名,假设我有:
1 2 | alias ll="ls -l" alias cls="clear;ls" |
创建一个以该别名命名的文件,对ll说:
1 2 3 4 | user@host$ vi ssh_aliases/ll <wyn>#inside ll,write ls -l</wyn> user@host$ chmod a+x ll |
现在编辑.bashrc包括:
1 2 | # If not running interactively, don't do anything [ -z"$PS1" ] && export $PATH=$PATH:~/ssh_aliases |
这就是工作。尽管我不确定这是不是最好的方法编辑(2)
您只需要对别名执行此操作,bashrc中的其他命令将按照david所指出的那样执行,"您必须有可执行文件才能让ssh运行命令"。
在所有脚本中都可见的别名的另一种选择是导出和执行变量
1 2 | # shortcut to set enviroment to insensitive case export go_I="shopt -s nocasematch" |
现在在任何脚本中都可以使用
$go_I # go Insensitive
[[ a == A ]] # evaluates TRUE ( $? == 0)
$go_C # maibe want to go back to casesensitive
在/path/to/my_命令和edit/etc/bash.bashrc中放置所有快捷方式/别名非常有用。
打开文件~/.bash_profile。如果此文件不存在,请在主目录中创建一个并添加下面的行
来源=$home/.bashrc
退出ssh并登录agian,您应该可以使用.bashrc设置。