我每天大部分时间都在通过 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)
手册页。