在本地计算机和 ssh 会话中以不同的方式设置 $PS1

在本地计算机和 ssh 会话中以不同的方式设置 $PS1

我将我的主目录置于版本控制之下,以便我的基本配置可在任何计算机上轻松获取。

我本地计算机上的 bash 命令提示符很复杂,包含当前 git 存储库及其状态。但是当我进入远程计算机时,我宁愿使用简单的user@host ~ $命令提示符。ssh

我希望能够更新我的.profile,以便它在本地运行时设置一个复杂的$PS1,在会话中运行时设置一个简化的ssh

基本上,我想要一些像$AM_I_LOGGED_IN_VIA_SSH变量这样的东西来测试我的.profile。这可能吗?

答案1

当您通过 SSH 登录时,会设置几个额外的环境变量。您可以使用这些变量作为测试,在 .profile 中设置 PS1。

if [ -n "$SSH_CLIENT" ]; then
    PS1="Via ssh: "
else
    PS1="Local: "
fi

答案2

如果你检查你的环境(env | grep SSH),你会发现几个候选项,例如$SSH_CLIENT$SSH_CONNECTION$SSH_TTY;具体列表将取决于版本sshd

答案3

如果你的 sshd 没有提供有用的变量,你可以使用

ps -p $PPID

或者其他一些随机的 ps 技巧(如果您的 shell 没有设置$PPID)来查看 shell 的父进程是否是您的远程登录进程。然后,如果父进程是远程进程,则切换 $PS1。然后下载 OpenSSH 并使用 geekosaur/Caleb 的建议,因为您的 ssh 服务器是垃圾。;)

或者,您可以使用“我是谁”的输出,抓住最后一个字段(即$( who am i | awk '$0=$NF')),并检查主机是远程主机还是本地主机,以决定您是本地登录还是远程登录。

或者您可以打开输出$(hostname)以让您的 shell 在特定主机上使用适当的 $PS1。

或者,让我们真的疯狂起来。如果您使用的是现代 shell - 如 bash、ksh93 或 zsh,您可以利用 $PS1 在执行时重新评估的事实。因此,如果您的 cwd 在存储库内,而其他内容在存储库外,您可以包含一个内联条件块来执行疯狂的 git 操作。例如,在这里我根据我所在的目录使用 进行提示更改[[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" ),基本上。

default prompt$ PS1='$(id -un) @ $(hostname)$( [[ $(pwd) = /tmp ]] && echo " [I am in /tmp]" || echo " /not/in/tmp")$ '
myname @ host /not/in/tmp$ cd /tmp
myname @ host [I am in /tmp]$ cd /etc
myname @ host /not/in/tmp$

当然,$PS1 定义在您的配置文件中看起来会很疯狂,但只有当您实际在 git 存储库中时,您才会获得超级多彩的 git 内容,而在其他地方,您拥有常规颜色。:) 请注意,您必须在 PS1 赋值周围使用单引号。您不希望在分配 PS1 时扩展变量;您希望在稍后评估 $PS1 时扩展它们。所以,使用单引号。

答案4

作为 Ignacio 回答的补充,为了使事情更清楚,PermitUSerEnvironment必须在服务器端启用该选项才能工作。如果服务器未启用此选项,您将无法与该服务器进行丰富多彩的 ssh 会话。

相关内容