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

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

我每天大部分时间都在通过 ssh 连接服务器。我有一系列别名/函数/脚本,它们允许我p hostname从终端输入内容并在远程端执行 GNU screen(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已被禁用。

答案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 中的多个副本中(这通常不是问题)。

答案2

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

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

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

答案3

.bashrc并且.bash_profile仅处理交互的shell,任何执行诸如screen(或echo测试用例中) 之类的程序的 shell 都不是。阅读 bash 手册页中有关BASH_ENV环境变量的信息,可以设置该变量以运行非交互式 shell 的启动脚本。

答案4

您可能还想使用~/.ssh/rc~/.ssh/environment。请参阅sshd(8)手册页。

相关内容