前言工欲善其事,必先利其器。在多次反复配置ubuntu开发环境后,最终还是决定花点时间总结一下,写成自动化配置脚本。服务器实例:ubuntu16.04,技术栈:shell,python。1、主机名可以通过hostnamenewname修改,但是最好写入/etc/hostname文件,重启生效。为了让同一内网网段的主机可以通过主机名访问,需要在/etc/hosts中加入私有ip解析。2、命令提示符和命令提示符相关的环境变量为PS1,初始值为:PS1='\[\e]0;\u@\h:\w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$',每个字符解释如下:#\u:当前登录用户名#\h:当前主机名(如ubuntu)#\H:完整域名当前主机(ubuntu.ubuntu.com)#\w:当前目录(绝对路径)#\W:当前目录的basename(只显示最后一级路径)#\$:一般用户为$,root用户是##\t:当前时间(24小时格式,HH:MM:SS)#\T:当前时间(12小时)#\@:当前时间(上午/下午)#\d:当前日期#\v:bashversion#\V:Bashrelease版本号#\S:Shell名称对我来说,只需要u,h,W(w如果多进几个目录,打命令的体验会很差),在为了让命令行一目了然,最好给命令提示符加上颜色PS1='${debian_chroot:+($debian_chroot)}\[\e[1;32m\]\u@\h\[\e[0m\]:\[\e[1;34m\]\W\[\e[0m\]\$',颜色代码解释如下:前景色背景色效果30m40;黑色31m41;红色32m42;绿色33m43;黄色34m44;蓝色35m45;紫色36m46;天蓝色37m47;white#\033[background;fontcolormor\e[background;fontcolorm#0重置属性为默认设置#1setbold#2sethalfbrightness(模拟颜色显示颜色)#4setunderline(模拟颜色显示颜色)#5设置闪烁#7设置反像#22设置一般密度#24关闭下划线#25关闭闪烁#27关闭反像,识别一些特定的字符序列,然后执行这些对应的函数或宏序列。通俗地说,就是绑定热键。例如,在bash中默认按下ctrl+a会执行将光标返回到行首的命令。这里我需要优化的是:1.tab补全忽略大小写;2、使用↑↓查询输入关键字的历史记录。vim~/.inputrc"\e[A":history-search-backward"\e[B":history-search-forward#autocompleteignoringcasesetshow-all-if-ambiguousonsetcompletion-ignore-caseonsource~/.inputrc4。我需要的历史:1.忽略重复的历史命令;2.保存更多的历史记录;3.无视具体历史记载;4.新建终端同步历史。exportHISTCONTROL=ignoreboth#ignoreboth=ignoredups:ignorespaceexportHISTSIZE=10000exportHISTFILESIZE=20000exportHISTIGNORE='pwd:ls'#确保所有终端保存historyshopt-shistappendexportPROMPT_COMMAND="history"要配置smooth-a;$5ANDPROMPT_COMMAND要想高效的使用git,我觉得有几点是必须配置的:5.1在命令提示符上显示git的基本信息安装git后,会在/etc/bash_completion.d目录下生成一个git-prompt文件:如果[[-e/usr/lib/git-core/git-sh-prompt]];然后。/usr/lib/git-core/git-sh-promptfi打开/usr/lib/git-core/git-sh-prompt,在里面注释写完整的操作步骤:#启用:##1)复制这个文件到某处(例如~/.git-prompt.sh)。#2)将以下行添加到你的.bashrc/.zshrc:#source~/.git-prompt.sh#3a)更改你的PS1以调用__git_ps1as#命令-substitution:#Bash:PS1='[\u@\h\W$(__git_ps1"(%s)")]\$'#ZSH:setoptPROMPT_SUBST;PS1='[%n@%m%c$(__git_ps1"(%s)")]\$'#可选参数将用作格式字符串。#3b)或者,稍微y更快的提示,__git_ps1可以#用于Bash中的PROMPT_COMMAND或Zsh#中的precmd(),带有两个参数,
和,它们是字符串#,您可以在状态字符串之前和之后放入$PS1#由git提示机制生成。例如#Bash:PROMPT_COMMAND='__git_ps1"\u@\h:\w""\\\$"'#willshowusername,at-sign,host,colon,cwd,then#variousstatusstring,followedbydollarandSP,作为#你的提示。#ZSH:precmd(){__git_ps1"%n"":%~$""|%s"}#将显示用户名,管道,然后是各种状态字符串,#后跟冒号,cwd,dollar和SP,作为你的提示符。shsource.git-prompt.shexportPS1='${debian_chroot:+($debian_chroot)}\[\e[1;32m\]\u@\h\[\e[0m\]:\[\e[1;34m\]\W$(__git_ps1"(%s)")\[\e[0m\]\$'exportPROMPT_COMMAND='__git_ps1"\[\e[1;32m\]\u@\h\[\e[0m\]:\[\e[1;34m\]\W\[\e[0m\]""\$"'接下来需要给几个git环境变量赋值让提示显示更多的git状态:)%h%Creset%C(青色)%C(粗体)%C(红色)%d%Creset%s%C(绿色)[%cn]%Creset%C(青色)[%cd]%Creset'--date=format-local:'%m-%d%H:%M'》显示效果:5.2多账户配置我有两个git账户,分别是gitee和github,每个账户都有自己的名字,email和ssh-钥匙,我需要:Ⅰ.两个帐户都可以使用自己的密钥对生成密钥对,无需密码访问:#ssh-keygen[-q][-bbits][-tdsa|ECDS|ed25519|搜索引擎优化|rsa1][-Nnew_passphrase][-Ccomment][-foutput_keyfile]ssh-keygen-trsa-C"github@youclk.com"-f~/.ssh/github/id_rsa-N""ssh-keygen-trsa-C"gitee@youclk.com"-f~/.ssh/gitee/id_rsa-N""edit~/.ssh/configHostgithub.com主机名github.com用户gitIdentityFile~/.ssh/github/id_rsaHostgitee.comHostNamegitee.comUsergitIdentityFile~/.ssh/gitee/id_rsa联通测试:Ⅱ.到达各自仓库时自动切换用户名和邮箱,以保证每个仓库都能使用正确的提交带有用户信息的版本,需要取消全局用户设置(不明白为什么用户信息在global应该覆盖每个仓库,反过来不是更好)gitconfig--global--unsetuser.namegitconfig--global--unsetuser.emal自动切换可以想到很多方案.我比较喜欢修改.git-prompt.sh,在__git_ps1()函数的末尾添加一段逻辑:if[-z`gitconfiguser.name`]&&[-z`gitconfiguser.email`];然后localgit_remote=`gitremote-v`if[[$git_remote=~"github"]];然后`gitconfiguser.name"github"&&gitconfiguser.email"github@youclk.com"`elif[[$git_remote=~"gitee"]];然后`gitconfiguser.name"gitee"&&gitconfiguser.email"gitee@youclk.com"`Fifi,顺便说一句,git默认忽略文件大小写。但是,作为一个轻度强迫症患者,我必须保持和远程仓库一模一样:gitconfig--globalcore.ignorecasefalse。6.密钥对管理我可能一次创建n台云服务器组成集群。每个集群都有一个领导者和n个追随者。follower只提供算力,应该把自己的全部权力交给leader。然后在领导者必须能够访问所有的追随者。这时候,统一的密钥对管理就非常有必要了。访问所有服务器只需要一个私钥。其实上一节提到的gitkeypair也是可以一起管理的。这一段展开的时候,其实是一些脚本实现,所以会在下一节进行总结。7、自动配置脚本现在我需要思考的是如何使用一行命令自动完成以上所有的配置。由于配置涉及到一些私钥等敏感信息,所以脚本必须放在git私有库中,但是ubuntu初始化的时候没有安装git,所以需要一个公共库来放置初始脚本。作用是安装git,访问私有库。最后需要执行如下一行代码来完成整个ubuntu环境的配置:#bash-c"$(curl-fsSLhttps://gitee.com/youclk/auto-config-entry/raw/master/centos/startup.sh)"bash-c"$(curl-fsSLhttps://gitee.com/youclk/entry/raw/master/ubuntu/setting.sh)"初始入口脚本比较简单(安装git,下载私有库并执行python脚本):#!/bin/bashaptupdate#installgitif[-z`whichgit`];如果[!$?-eq0];然后退出0;fifi#将路径切换到.auto_configif[!-d~/.auto_config];然后mkdir~/.auto_config如果[!$?-eq0];然后退出0;fificd~/.auto_config#clonetoolsprojectif[!-d“工具”];然后gitclonehttps://gitee.com/youclk/tools.gitif[!$?-eq0];然后退出0;fificdtools/ubuntupython3setting.pyrm-r~/.auto_config下面是python部分的结构:代码比较简单,就是读写文件和结合系统命令的一些操作(步骤和说明写在评论,所以我不会重复它们)。setting.py:importosimportsocketimportsubprocessimportsyssys.path.append('../')fromutilityimporthostdefedit_hostname():"""edit/etc/hostnameand/etc/hosts"""old_hostname=socket.gethostname()new_hostname=str.strip(input('请写一个主机名:'))ifnew_hostnameandold_hostname!=new_hostname:subprocess.check_call(['hostname',new_hostname])hostname_dir='/etc/hostname'hosts_dir='/etc/hosts'#使用open(hostname_dir,'w')asf写入主机名:f.write(new_hostname+'\n')#使用open(hosts_dir,'r')asf:hosts_lines=f.readlines读取主机()#使用open(hosts_dir,'w')asf:local_ip=host.get_local_ip()n=0foriinrange(0,len(hosts_lines)):iflocal_ipinhosts_lines[i]:hosts_lines[i]=hosts_lines[i].replace(old_hostname,new_hostname)n+=1如果不是n:hosts_lines.append('\n'+local_ip+'\t'+new_hostname+'\n')f.writelines(hosts_lines)defcopy_config_files():"""配置git历史readLinecommandPrompt"""subprocess.check_call('cp-rbash_script/.~/.',shell=True)withopen('/root/.bashrc','r+')asf:bashrc=f.read()如果'.bashrc_pro'不在bashrc中:f.write('\nsource~/.bashrc_pro.sh\n')defconfigure_ssh_key():#copyssk_keysubprocess.check_call('cp-rssh_key/.~/.ssh/.',shell=True)#chmodsubprocess.check_call('chmod400~/.ssh/*/id_rsa',shell=True)#配置gitconfiggithub_config='''Hostgithub.comHostNamegithub.comUsergitIdentityFile~/.ssh/git/id_rsa'''gitee_config='''Hostgitee.comHostNamegitee.comUsergitIdentityFile~/.ssh/git/id_rsa'''ifos.path.exists('/root/.ssh/配置'):withopen('/root/.ssh/config','r+')asf:git_config=f.read()if'github.com'notingit_config:f.write(github_config)elif'gitee.com'not在git_config中:f.write(gitee_config)else:withopen('/root/.ssh/config','w')asf:f.write(github_config+gitee_config)if__name__=='__main__':ifos.getuid()==0:edit_hostname()copy_config_files()configure_ssh_key()print('success')else:print('pleaseswitchuser=>root')host.py(一些可以公共使用的随意数单独抽离出来):importsocketdefget_local_ip():withsocket.socket(socket.AF_INET,socket.SOCK_DGRAM)asnet:net.connect(('8.8.8.8',80))returnnet.getsockname()[0].bashrc_pro.sh:#!/bin/bash#配置gitsource.git_prompt.shexportPS1='${debian_chroot:+($debian_chroot)}\[\e[1;32m\]\u@\h\[\e[0m\]:\[\e[1;34m\]\W$(__git_ps1"(%s)")\[\e[0m\]\$'if["$(whoami)"=="root"];然后ps1_symbol="#"elseps1_symbol="$"fiexportPROMPT_COMMAND='__git_ps1"\[\e[1;32m\]\u@\h\[\e[0m\]:\[\e[1;34m\]\W\[\e[0m\]""$ps1_symbol"'exportGIT_PS1_SHOWDIRTYSTATE=t??rueexportGIT_PS1_SHOWCOLORHINTS=trueexportGIT_PS1_SHOWUNTRACKEDFILES=trueexportGIT_PS1_SHOWUPSTREAM="auto"#historyexportHISTCONTROL=ignoreboth#ignoreexport0IZEexport0IST0ignore0Signedup0HISTFILESIZE=20000exportHISTIGNORE='pwd:ls'shopt-shistappendexportPROMPT_COMMAND="history-a;$PROMPT_COMMAND"#确保所有终端都保存历史#aliasaliasaliyun="ssh-i~/.ssh/aliyun/id_rsa"去掉一坨,拿到服务器就可以愉快的玩了。当然,以上脚本仅适合我个人使用习惯,部分代码逻辑比较粗糙,请大家参考,多多点赞,请勿直接使用,如果有更好的想法,欢迎留言。我的公众号《捷义》