通过ssh推送我的PS1提示


19

我使用我喜欢的特定“ PS1”提示。我在一些不同的服务器上与其他人共享一些登录名。我想知道是否有一种方法可以在我的本地bash配置文件中指定一个远程提示,或者是否有其他方法可以在每次远程访问时进行复制和粘贴。

Answers:


17

~/.my_custom_bashrc使用您的自定义bash配置在每台远程计算机上上传一个文件,例如,PS1=...然后ssh使用以下命令启动:

ssh user@host -t "bash --rcfile ~/.my_custom_bashrc -i"

您可以轻松地将bash函数用作包装器以提高可读性。


10

如果您只想发送PS1变量,并且其中不包含'(单引号),请尝试:

ssh targethost -t "PS1='$PS1'; exec bash"

不过,当地人.bashrc可能会改写PS1(感谢Dennis Williamson指出这一点)。

多种方法可以通过ssh传输环境变量,但是通常在服务器配置中将其禁用。如果PermitUserEnvironment服务器配置中启用了伪指令,并且每个用户都有自己的密钥对(是的,您可能不太幸运),则可以将其添加environment="PS1=…"到与~/.ssh/authorized_keys密钥相对应的行中。

如果要在共享用户帐户上保留自己的配置,则可以创建自己的配置文件目录,并将HOME环境变量设置为指向该目录。

ssh targethost mkdir mrstatic.home
scp .bashrc targethost:mrstatic.home/

mrstatic.home当您要与其他用户共享文件时,在目录中创建指向父目录中相应条目的符号链接。

然后,使用

ssh targethost -t 'HOME=~/mrstatic.home; exec bash'`

如果您愿意修改远程.profile文件(或其他初始化文件),则可以自动进行设置。许多站点都允许LC_*环境变量通过(通常将它们用于语言环境设置)。如果同时满足这两个条件,则可以LC_USER在客户端上设置一个实际上不用于语言环境的变量,然后在服务器中对其进行测试.profile

(当然,共享帐户不是一个好主意,但我知道您可能无法改变这种情况。)


3
ssh -t user@host "remote='$PS1' bash -i"

然后,在提示符下:

PS1=$remote

1
如果不加引号,复杂的bash提示可能会中断(来自您,我很惊讶)。以及为什么需要额外的命令,而不仅仅是命令"PS1='$PS1' bash -i"(为什么也不要exec)?
吉尔(Gilles)“所以,别再邪恶了”,2010年

1
@吉尔斯:缺少报价:草率。额外的命令:PS1在shell启动过程中被覆盖并不罕见。没有执行官:在我的系统上进行测试时,似乎没有什么区别-没有额外的过程。
暂停,直到另行通知。

1
哦,是的,这很好,本地.bashrc很可能会覆盖PS1
吉尔斯(Gillles)“所以-别再邪恶了”

2

将您的PS1提示符放在〜/ .ssh / environment中,并且ssh会话会将其携带到您登录的每个主机。它适用于我的openssh 4.3p2。


1
这仅在服务器配置已启用时才有效PermitUserEnvironment,默认情况下处于禁用状态。
Flimm

1

您可以在客户端指定环境变量,如果ssh-server允许它(检查man sshd-config),则在登录计算机时会将这些变量复制到会话中。

因此,您必须在服务器上配置.bashrc来检查现有的PS1(或任何变量),并且仅在尚未设置PS1的情况下进行设置。

或者,这使事情变得更简单,您将设置捆绑到一个函数..中,并将该函数作为特殊文件部署到您的按需源(source joes_bashrc)或直接部署到.bashrc中。拥有自己的文件似乎更强大。其他人可能会使用您的设置,但并没有被迫使用。


1

不共享登录名。像自己一样使用SSH,然后执行sudo -su shareduser-s表示“ shell”)。

sudo保持你的主目录:

Defaults env_keep += "HOME"

当我升职时,我将尝试制定该政策,但目前我对此还一意孤行。
Unfundednut

1

如果您想这样做而无需额外的scp,则可以执行以下操作:

ssh -t srvname ' cp ~/.bashrc ~/.bashrc.n &>/dev/null ; echo "LS_COLORS=\"no=00:fi=00:ETC:ETC:ETC\";" >> ~/.bashrc.n ; echo "export LS_COLORS" >> ~/.bashrc.n ; echo "alias ls=\"ls --color=auto\";" >> ~/.bashrc.n ; exec bash --rcfile ~/.bashrc.n'

这将生成一个基于服务器bashrc的.bashrc.n,但带有您的替代项。


这就是为什么有些人害怕码头。

0

如果您愿意不知不觉地对您的同事打扰,并且您可以相信他们不会干扰您的偏好,那么我建议您结合使用cYrus的答案akira的答案Dennis Williamson的答案

  1. 在每台服务器上,编辑~/.bashrc并添加
    如果[“ $ Unf” = 1]#Unfundednut的特殊代码
    然后
        PS1 =“ (您想要的提示)(任何其他自定义你想要的) 
    网络连接
    在末尾。尽管您的同事“不希望[您]写出基本资料”,但除非去寻找,否则他们不会意识到这一点。
  2. 登录到远程服务器时,请执行
    ssh -t 用户 @ 主机 “ Unf = 1 bash -i”
    虽然您可能希望将其放入本地帐户的别名或shell函数中,但它足够短-比任何其他答案都短-您可以轻松地手动键入它。

我相信这很清楚,但是:当您登录该ssh命令时,该命令将导致Unf在远程服务器上设置该变量。这将在remote中调用您的代码.bashrc,这将使您的自定义生效。由于您将代码放在的末尾.bashrc,因此它将覆盖文件前面的常规设置。

披露:我尚未对此进行测试。


-1

最简单的方法是恕我直言:

ssh user@server 'PROMPT_COMMAND=export PS1="changeme $" bash -li;'

我不确定是否可行;它似乎缺少一层引号。即使这样做,设置PROMPT_COMMAND(每次shell发出提示时都会执行)似乎是解决此问题的一种非常繁琐的方法。而且,由于它有些不可思议,因此任何暗示它的答案都应该对它的工作原理进行解释。
斯科特

-2

您可以做一些事情,例如通过sshfs / nfs安装房屋,但是最简单的解决方案是将bashrc扩展到新计算机上。这也带来了别名和其他东西。


正如我在问题中所述,我与其他人分享了这些登录信息。我很确定他们不会感谢我写基本配置文件。
Unfundednut

1
在NFS上挂载$ HOME很疯狂。只是在说'。
韦斯利·赖斯2010年
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.