![在本地计算机和 ssh 会话中以不同的方式设置 $PS1](https://linux22.com/image/1280387/%E5%9C%A8%E6%9C%AC%E5%9C%B0%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%92%8C%20ssh%20%E4%BC%9A%E8%AF%9D%E4%B8%AD%E4%BB%A5%E4%B8%8D%E5%90%8C%E7%9A%84%E6%96%B9%E5%BC%8F%E8%AE%BE%E7%BD%AE%20%24PS1.png)
我将我的主目录置于版本控制之下,以便我的基本配置可在任何计算机上轻松获取。
我本地计算机上的 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 会话。