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


9

我将我的主目录保留在版本控制之下,这样我的基本配置就可以在任何计算机上轻松使用。

我的本地计算机上的bash命令提示符是一个复杂,丰富多彩的东西,包括当前的git存储库及其状态。但是user@host ~ $当我ssh进入远程机器时,我宁愿有一个简单的命令提示符。

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

基本上,我喜欢像我的$AM_I_LOGGED_IN_VIA_SSH变量一样的变量.profile。那可能吗?

Answers:


8

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

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

7

如果你检查你的环境(env | grep SSH),你会发现一些考生如$SSH_CLIENT$SSH_CONNECTION$SSH_TTY; 确切的列表将取决于sshd版本。


2

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

ps -p $PPID

或者其他一些随机的ps技巧(如果你的shell没有设置$PPID)来查看shell的父进程是否是你的远程登录进程。然后,如果parent-is-remote-thingie切换$ 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-stuff,而你在其他地方使用常规颜色。:)请注意,您必须在PS1分配周围使用单引号。分配PS1时,您不希望扩展变量; 你希望它们在以后评估$ PS1时展开。所以,单引号。


1

如果PermitUserEnvironment在sshd中启用,那么您可以使用~/.ssh/environment创建$PS1,然后只检测脚本中通常设置它的值的存在。


0

作为Ignacio的回答的补充,为了清楚PermitUSerEnvironment起见,必须在服务器端启用选项才能使其正常工作。如果服务器未启用此选项,则不会与该服务器进行彩色ssh会话。

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.