有没有办法可以使用我的bash配置文件定义的$ PATH?


3

我把大部分时间花在服务器上。我有一系列允许我输入的别名/函数/脚本 p hostname 从终端使用以下命令执行远程端的GNU屏幕(1):

exec ssh hostname -t 'screen -RD'`

我最近才注意到这一点 ssh -t 没有得到我的习惯 $PATH。这是一些终端输出:

adam@workstation:~:0$ sh server 'echo $PATH'
/home/adam/bin:/usr/local/bin:/bin:/usr/bin:/opt/git/bin:/opt/git/libexec/git-core
adam@workstation:~:0$ ssh server -t 'echo $PATH'
/usr/local/bin:/bin:/usr/bin
Connection to uranus.plymouth.edu closed.

我最大的问题是我的自定义别名只能尝试执行 screen因为我无法保证绝对的道路,而我的 $PATH 是结构化的,所以shell应该找到正确的。如果我的 $PATH 设置不受尊重,我的脚本不起作用。有没有办法可以使用 $PATH 由我的定义 .bashrc / .bash_profile

我相信 PermitUserEnvironment 被禁用。

Answers:


1

如果您可以更改别名使用的命令,则可以让远程端创建“交互式”,“登录”实例 庆典 (即使用你的 .bashrc.bash_profile ) 跑步 屏幕

ssh server -t 'exec bash -ilc "exec screen -RD"'

此外,如果您没有在内部创建的shell中获得正常环境(PATH,shell设置等) 屏幕 ,你可能需要告诉 屏幕 创建“登录”shell。放 shell -bash 在你的 .screenrc 在远程端,或添加 -s -bash 到你的 屏幕 调用:

ssh server -t 'exec bash -ilc "exec screen -RDs -bash"'

这肯定会运行你的 .bash_profile 两次(之前一次 屏幕 ,一次为每个在里面创建的shell 屏幕 )。根据您对PATH操作的处理方式,这可能会导致PATH添加相同的多个副本(这通常不是问题)。


0

您的自定义$ PATH可能设置在.bashrc中,该伪目录在伪tty环境下运行时退出 ssh -t ...

我对此没有任何直接的经验,但我打赌如果你检查.bashrc你会看到它退出如果没有设置$ PS1,或者[-t 1]失败,或类似的东西,在设置之前$ PATH。如果你进行实验,你可能会发现它 ssh server 'try_that_test'ssh server -t 'try_that_test' 给出不同的结果。

可能你可以通过使测试更复杂来修复它,检查你是否在ssh下运行。


我的 .bashrc 来源 .bash_profile,和前两行 .bash_profile 出口 PS1PATH
Annika Backstrom

好奇。刚刚在我的机器上测试过 ssh localhost 'echo $PATH'ssh localhost -t 'echo $PATH' 两者都给我默认的PATH。但 ssh localhostssh localhost -t 两个都给我一个shell我的自定义PATHs。
dubiousjim

0

.bashrc.bash_profile 只处理 互动 shell,执行程序的任何shell,如 screen (要么 echo 在测试案例中)不是。阅读bash手册页中有关的内容 BASH_ENV 环境变量,可以设置为运行非交互式shell的启动脚本。


@Peter,是的我也认为他的shell的非交互性可能是负责任的。但令人费解的是,为什么他在获得$ PATH后会改变 ssh server 'echo $PATH' (没有 -t )。
dubiousjim

bashrc源自所有shell,包括交互式和非交互式。
Rich Homolka

@Rich Homolka:不,我怕你错了。
Peter Eisentraut

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.