How do I set $PATH such that `ssh user@host command` works?
我似乎无法设置一个新的$ PATH,以便在通过ssh user@host command执行命令时使用它。 我尝试在远程机器上将export PATH=$PATH:$HOME/new_path添加到?/ .bashrc和?/ .profile,但是执行ssh user@host"echo \$PATH"表示没有获取更改(它显示/ usr / local / sbin:/ usr / local/斌:/ usr / sbin目录:在/ usr/ bin中:/ sbin目录:/ bin中:在/ usr/游戏)。 远程计算机正在运行Ubuntu 8.04。
我确信我可以将其破解到/ etc / profile中,但这不是一个干净的解决方案,只有在具有root访问权限时才有效。
-
我尝试将export PATH=$PATH:$HOME/new_path添加到?/ .bash_login和?/ .bash_profile(除了之前尝试的?/ .bashrc和?/ .profile)。 两者都不起作用。 在这两种情况下,我都必须创建文件。
-
在我的特定用例中,修改发送到ssh的命令并不容易。 我正在使用stfufs(guru-group.fi/too/sw/stfufs),它构造了ssh命令本身。 我意识到它的方法不是一个很好的解决方案,但如果不修改stfuf就可以修复它。
-
你可以用stfufs的方式放一个ssh包装器,用修改后的args调用真正的ssh,如果这样更容易
正如grawity所说,?/ .bashrc就是你想要的,因为它是由非交互式非登录shell提供的。
我希望你遇到的问题与默认的Ubuntu~ / .bashrc文件有关。它通常以这样的东西开头:
1 2
| # If not running interactively, don't do anything
[ -z"$PS1" ] && return |
您希望在此行之前为非交互式shell添加任何内容。
-
是的,我把export PATH=$PATH:$HOME/new_path移到了那条线上方并且有效。谢谢!
-
.bashrc不可靠。 man bash:"Bash尝试确定何时将其标准输入连接到网络连接"。这适用于RHEL,但不适用于Archlinux。我不得不编辑/ etc / environment来更改默认的PATH
-
你应该为zsh用户添加.zshenv的提及,我花了很长时间才在其他答案的评论中找到它
你有~/.bash_login或~/.bash_profile吗?
交互模式下的Bash检查这些文件,并按以下顺序使用第一个现有文件:
~/.bash_profile
~/.bash_login
~/.profile
因此,如果您有一个~/.bash_profile,那么您对~/.profile所做的任何更改都将保持不变。
非交互模式下的Bash有时会读取文件~/.bashrc(通常也是来自交互式脚本的源文件。)"有时"我的意思是它依赖于分发:非常奇怪,有一个编译时选项为了实现这一点。 Debian启用~/.bashrc读取,例如拱门没有。
ssh似乎使用非交互模式,所以~/.bashrc应该足够了。遇到这样的问题时,我通常会添加一些echo来查看正在运行的文件。 del>
-
添加回声有帮助...但我仍在追逐执行'ssh -X remotemachine"xterm"'的方法,并从/ etc / profile和?/ home / username / .bash_profile获得完整的系统/用户路径。如果我在命令中同时发送这两个文件,它就可以工作..但是它的丑陋:)。
-
你怎么知道"非交互模式下的Bash读取文件~/.bashrc"?我在联机帮助页中没有看到此声明。谢谢
-
如果您想要一个非交互式非登录shell来源~/.bashrc,您似乎需要另外设置环境变量BASH_ENV;请访问superuser.com/a/585699/100843。对于非交互式登录shell,您可能必须修改您提到的三个启动脚本之一。
-
对于ZSH,非交互式文件是:.zshenv
-
~/.bash_profile为我工作
-
@math .zshenv总是来源;它是否具有互动性并不重要。
ssh文档说:
If command is specified, it is executed on the remote host instead of a login shell.
这就是为什么添加到bashrc文件不起作用。但是你有以下选择:
如果在sshd配置中设置了PermitUserEnvironment选项,则可以将PATH设置添加到~/.ssh/environment
ssh remotemachine 'bash -l -c"somecommand"'
-
1.它没有在我的sshd配置中设置,man sshd_config表示它默认是关闭的,所以这个解决方案不太适合大多数人。 2.这样可行,但我无法轻易修改发送到ssh的命令(请参阅我的问题的第二条评论)。
-
1.不能按预期工作,因为在?/ .ssh / environment中,您无法向PATH添加pathes,因为$ PATH将无法解析。
你总是可以说:
1
| ssh remotemachine 'export PATH=wedontneedastinkingpath; echo $PATH' |
-
这个解决方案不需要对远程机器进行任何更改,这是一件好事。
除@signpolyma答案外,您还必须在这些行之前添加导出
1 2 3 4 5
| # If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac |
-
我实际上只是完全注释掉了这些行 - 在Ubuntu 16.04 LTS桌面的?/ .bashrc中找到。没有一切正常。同时将PermitUserEnvironment设置为yes。
我自己也遇到了同样的问题,用以下方法解决了:
1
| ssh user@remotehost PATH=\$HOME/bin:\$PATH\; remote-command |