为所有用户更改Linux命令提示符的最有效方法?

我有几台机器和主机名是真的很长..即companyname-ux-staging-web1.companyname.com。 所以我的提示看起来像

[root@mycompany-ux-staging-web1 ~]# 

我想尽可能缩短所有机器上所有用户的工作量。 从我读到的我有几个select,但他们都有他们的缺点。

我可以更改主机名,但这可能会影响应用程序。 不是一个很好的select。

我可以通过编辑现有用户的所有.bashrc,并为潜在的新用户编辑/etc/skel/.bashrc,在login时为所有用户更改$ PS1。 在10台以上的机器上,这是很多的工作。

我最好的select是什么,或者我忽略了什么?

你应该可能导出PS1。 编辑用户的bashrc,而不是编辑系统的bashrc:用户应该能够覆盖他们的select提示。

其次,分配文件使用scp或clusterssh。 如果您设置了一个rsa密钥,那么您甚至不需要为scpinput一次以上的密码:

 eval `ssh-agent` ssh-add for h in `cat ~/hostlist`; do scp ~/newbashrc ${h}:/etc/bashrc done eval `ssh-agent -k` 

它不应该比您用来在这十台服务器上部署新configuration的任何现有configurationpipe理工作更多。 如果这对于你的组织来说是一个持续的问题,那么你肯定希望看一下像Puppet / Chef / Cfengine这样的configurationpipe理工具和像MCollective / RunDeck / Capistrano / Fabric这样的部署工具。

编辑/ etc / profile

/ etc / profile在用户login时运行。〜/ .bashrc为其他shell运行(例如,打开一个xterm)

导出PS1 =“[\ e [0; 35m] [\ u \ t \ h \ W] \ $ [\ e [0m]”

你可能会想要拿出\ h

  • \ u:显示当前的用户名
  • \ h:显示主机名
  • W:打印当前的工作目录
  • \ H:显示FQDN主机名
  • \ @:以12小时am / pm格式显示当前时间
  • \ t:24小时HH:MM:SS格式的当前时间
  • \ e:ASCII转义字符(033)

https://wiki.archlinux.org/index.php/Color_Bash_Prompt

你可以在/ etc / bashrc中编辑全系统的bashrc,但是很容易被shell访问的用户覆盖。 你可以很容易地编写脚本来使用scp为用户列表推出一个新的.bashrc。

如上所述,scp可能是最简单的脚本。 另一个select是rysnc。 另外,你可以使用sshkeys来做cron。

您可以在/etc/profile.d/目录中创build一个可执行脚本,例如:/etc/profile.d/custom_prompt.sh,包含以下内容:

 #!/bin/sh export PROMPT_COMMAND='export PS1="[\e[0;35m][\u \t \h \W]\$ [\e[0m]"' 

使用这种方法,您无需修改​​任何文件即可更改所有用户的bash提示。

如果您可以一次向所有服务器发送命令来更新文件,则您的第二个选项似乎是可行的。 为此,您可以在Linux上使用pssh( http://code.google.com/p/parallel-ssh/ )或在PuTTY上使用PuTTY Command Sender( http://www.millardsoftware.com/puttycs )。

你可以build立一个sed / awk命令来replaceskel .bashrc和/etc/bashrc和用户bashrc文件中的行。 然后把这个作为一个命令发送给所有的系统。

sed命令将可能是最多的工作。 不幸的是,我不像sed和awk那么好。 其他人可能会在这方面提供更多的见解。 希望这个信息有帮助!

我必须为多个Ubuntu服务器和所有用户这样做,我想在提示符上有完整的FQDN,而不是主机名(与您所做的相反)。 我发现改变/etc/bash.bashrc是不够的。 我也尝试了不同的profile.d文件,但它是无用的,因为home .bashrc总是最后应用。

我最终所做的就是将下面的脚本推送给所有服务器,这对所有用户和所有将来的应用程序都有好处。

  #!/bin/bash for userfolders in `ls -d /home/*/` do for bashfiles in `ls -1 ${userfolders}.bashrc` do sed -i 's|u@\\h|u@\\H|g' $bashfiles done done sed -i 's|u@\\h|u@\\H|g' /etc/bash.bashrc sed -i 's|u@\\h|u@\\H|g' /etc/skel/.bashrc sed -i 's|u@\\h|u@\\H|g' /root/.bashrc