ssh 命令执行不考虑 .bashrc | .bash_login | .ssh/rc? [复制]
Posted
技术标签:
【中文标题】ssh 命令执行不考虑 .bashrc | .bash_login | .ssh/rc? [复制]【英文标题】:ssh command execution doesn't consider .bashrc | .bash_login | .ssh/rc? [duplicate] 【发布时间】:2010-11-14 23:08:56 【问题描述】:我正在尝试通过 ssh 远程执行命令,例如:
ssh <user>@<host> <command>
需要执行的命令是别名,在.bashrc中定义,例如
alias ll='ls -al'
那么到底应该执行以下命令:
ssh user@host "ll"
我已经发现 .bashrc 只能通过交互式 shell 获取,所以我在 .bash_login 中输入:
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
我还尝试直接在 .bash_login 中定义别名。
我还尝试将 .bashrc 的别名定义/来源放在 .bash_profile 和 .ssh/rc 中。但这些都不起作用。 请注意,我无法更改调用 ssh 命令的方式,因为这是某些二进制安装脚本的一部分。我唯一可以修改的是环境。执行 ssh 命令时是否还有其他可能获取此别名的来源?是否有一些 ssh 配置需要调整?
【问题讨论】:
这些文件(.bashrc 等)在哪台机器上?您要 ssh-ing 到的机器,还是要从中 ssh-ing 的机器? 文件在我 ssh 到的机器上 我也已经为我的用户检查了 /etc/passwd。它定义了 /usr/bin/bash。 你试过.bash_profile
吗?这就是.bashrc
在我的机器中的来源。
是的,我也试过 .bash_profile 和 .profile 也没有用。
【参考方案1】:
来自 bash 的手册页:
当 shell 不是交互式时,别名不会展开,除非使用
shopt
设置了expand_aliases
shell 选项
有几种方法可以做到这一点,但最简单的方法是将以下行添加到您的 .bashrc
文件中:
shopt -s expand_aliases
【讨论】:
我支持你,但你应该解释它的作用。 正如这里其他地方所解释的,shell 不处于交互模式。这启用了扩展别名的选项。来自文档:如果设置,别名将按照上面 ALIASES 下的描述进行扩展。默认情况下,交互式 shell 启用此选项。 是的,我找到了,我只是建议您将其添加到您的评论中。我尝试在ssh $HOST 'shopt -s expand_aliases; ll'
中执行该命令,但没有奏效。放在.bashrc里应该可以,但我没试过。
哦,好的。如果您不想更改目标机器上的环境,您可以尝试其他几件事:ssh user@host "bash -ic ll"
通过“交互式”运行命令为我工作,并且手册页还讨论了设置 shopt 选项一个 -O
标志来 bash。
@bradlis7 您的尝试失败,因为 bash 在读取该行时会扩展别名(这是在执行“shopt -s expand_aliases”之前)。详情请见this answer。【参考方案2】:
代替:
ssh user@host "bash -c ll"
尝试:
ssh user@host "bash -ic ll"
强制 bash 使用“交互式 shell”。
【讨论】:
对我来说,我必须使用ssh user@host "bash -lc ll"
——一个 l 而不是 i。 (利马而不是印度。)
我尝试了-ic
,效果很好!谢谢!
但是,这是否意味着我必须在 SSH 调用中添加每个别名?我指的是 "ssh user@host "bash -ic ll"" 的 "ll" 部分【参考方案3】:
编辑:
正如here 所指出的,关于非交互式 shell..
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
# execution returns after this line
现在,对于 bashrc 文件中的每个别名,都说我有:
alias ll="ls -l"
alias cls="clear;ls"
为 ll 创建一个以该别名命名的文件:
user@host$ vi ssh_aliases/ll#inside ll,write
ls -l
user@host$ chmod a+x ll
现在编辑 .bashrc 以包含:
# If not running interactively, don't do anything
[ -z "$PS1" ] && export $PATH=$PATH:~/ssh_aliases
这可以完成工作.. 虽然我不确定这是否是最好的方法EDIT(2) 您只需要对别名执行此操作,bashrc 中的其他命令将按照 David 所指出的那样执行“您必须具有可执行文件才能 ssh 运行命令”。
【讨论】:
感谢您的建议。安装脚本调用的别名是在安装目录中某个位置的自定义 bashrc 中定义的,在该自定义 bashrc 中,除了别名之外,还定义了许多导出变量。因此,使用您的解决方案,我需要为每个别名/导出创建一个文件? 我刚试过,可惜还是不行。我不确定,但调用 ssh 时似乎没有获取 .bashrc。 在“# If not running interactive, don't do anything”行之前尝试一些 echo 语句,并调用第一个表单命令行,如:ssh user@machineCORRECT
的回答吗?
@stanleyxu2005 这背后的想法是为远程计算机上的每个别名创建一个二进制文件,然后使用 ssh 远程运行它。我在这里看到的唯一问题是您正在编辑的 .bashrc 没有来源,并且该命令无法执行。在这种情况下,您必须找出适当的 .bashrc(正确的用户)并对其进行编辑。【参考方案4】:
在所有脚本中都可见的别名的替代方法是 导出 & 执行变量
# shortcut to set enviroment to insensitive case
export go_I="shopt -s nocasematch"
现在可以在任何脚本中使用
#!/bin/bash
$go_I # go Insensitive
[[ a == A ]] # evaluates TRUE ( $? == 0)
$go_C # maibe want to go back to casesensitive
将所有快捷方式/别名放在 /path/to/my_commands 并编辑 /etc/bash.bashrc
很有用source /path/to/my_commands
【讨论】:
这不能回答问题。【参考方案5】:打开文件 ~/.bash_profile。如果此文件不存在,则在主目录中创建一个并添加以下行
source = $HOME/.bashrc
退出您的 ssh 并再次登录,您应该可以让 .bashrc 设置为您工作。
【讨论】:
这应该是source $HOME/.bashrc
或. $HOME/.bashrc
。以上是关于ssh 命令执行不考虑 .bashrc | .bash_login | .ssh/rc? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
配置开机自启命令文件~/.bashrc/etc/profile/etc/bash.bashrc的异同(bashrc:Bash Run Commands)