背景
在windows中,有诸如XShell,SecureCRT等ssh连贯神器,但在Mac中,可抉择的工具并不多,ITerm2被一众程序员吹上了天,但本人理论用下来并不好用,对终端的执念让我基本上尝试了所有在Mac上能找失去的终端工具,最终抉择了termius,该工具界面有点极客风,设计简洁,连贯速度快,惋惜的是如果用户退出所有记录将被革除,在被革除两次后终于无奈的放弃了Mac下惟一上手的终端工具,放弃termius后却很难再找一个称心的终端,mac自带的终端其实还行,就是不大好用,现实中的终端应该满足以下性能
- 可能发送心跳包,不至于因为断网或者闲置工夫过长连贯断开须要重连
- 可能有肯定的治理性能,记住明码,不必每次输出地址和账号,这个也是最重要的需要
- 反对tab页,反对分屏
- 可能上传下载文件
- 颜值要高
- 能够抉择复制,因为在终端常常须要复制,大部分终端都能够抉择即可复制,无需手动ctrl+c
如果mac自带终端可能满足以上需要,就齐全能够用于日常开发,那么接下来咱们就一步步革新终端
心跳检测
用过ssh终端的都晓得,如果网络断开或者长时间不操作,会导致终端掉线,体现为键盘无响应,须要从新连贯,有时候咱们在服务器工作目录下,从新登录又要切换到当前目录,十分到不不便,因而个别终端都能够配置一个心跳检测,终端会定时发送心跳包放弃连贯,Mac终端也提供了该配置,编辑文件/etc/ssh/ssh_config
减少以下配置
$ sudo vi /etc/ssh/ssh_configServerAliveInterval 60ServerAliveCountMax 999
- ServerAliveInterval:发送心跳包距离,单位秒
- ServerAliveCountMax:最多发送多少次失败就断开连接
另外/etc/ssh/ssh_config
文件中有SendEnv LANG LC_*
配置,将服务器语言环境设置为和本地一样的环境,个别咱们本机是中文环境,但不肯定所有Linux服务器都反对中文环境,有时候可能呈现乱码,因而这里倡议正文掉该配置。
颜值
颜值真的就仁者见仁,mac终端提供了自定义主题的性能,在菜单终端->偏好设置
中
另外能够编辑文件/etc/motd
文件,自定义终端欢送页
你能够也能够装置第三方shell,比方Oh My Zsh
治理性能
这个需要是硬需要,不可能每次连贯都从新输出地址和账号信息,得有个计划记录用户名和明码,并且可能通过脚本得形式进行主动连贯,ssh工具自身处于平安思考不提供在命令行中指定明码性能,也就是你不能通过相似ssh {password} {user}@{host}
形式进行连贯,必须手动输出明码,所以第一步就是解决主动登录问题。
主动登录
sshpass就是解决ssh手动输出明码的问题,你能够通过brew装置sshpass
brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb
如果没有装置brew,你能够下载源码自行编译装置
装置sshpass后,能够通过以下命令登录服务器
# 登录sshsshpass -p "password" ssh user@host# 登录sftpsshpass -p "password" sftp user@host
治理
解决了主动登录问题,那么就必须有中央治理连贯,其实就是把其余终端工具的界面操作搬到控制台实现,咱们假如有一个工具叫PowerTerminal
简称pw,pw提供以下性能
# 创立新连贯pw create $连贯名称 $ip $用户名 $明码# 列出所有连贯pw# 依据关键字搜寻连贯pw $关键字# 在显示所有连贯后能够依据编号抉择连贯某个连贯# sftppw sftp
界面成果
创立连贯
$ pw create➜ 分组 : huaweiyun➜ ip : 192.168.10.100➜ 名称 : oam➜ 登录名: oam➜ 明码 : oam增加主机 192.168.10.100 胜利
服务器列表
$ pw服务器列表1. aliyun ➡ 192.168.1.100(hr)2. aliyun ➡ 192.168.1.101(bpm)3. huaweiyun ➡ 192.168.10.100(oam)4. huaweiyun ➡ 192.168.10.101(soa)➜ 输出编号 :
关键字搜寻
$ pw huawei服务器列表1. huaweiyun ➡ 192.168.10.100(oam)2. huaweiyun ➡ 192.168.10.101(soa)➜ 输出编号 :
输出后面的数字编号后便可主动连贯,我心愿是关上新的tab页而不是在以后页面关上,只有在脚本执行以下命令便可在终端关上新的tab页并且在新tab页执行命令
osascript -e 'tell application "Terminal" to activate' -e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' -e 'tell application "Terminal" to do script "'"$v_script"'" in selected tab of the front window'
$v_script
就是要执行的命令,这里借助了Mac自带的脚本性能,因而无奈跨平台,如果是在以后tab页关上连贯就能够间接执行sshpass命令。这里也要关上脚本辅助性能权限,在零碎偏好设置中找到平安与隐衷,在辅助性能中将脚本编辑器和终端加进去
残缺脚本pw.sh
#!/bin/bash## author by jianfeng.zheng@definesys.comv_pw_home=~/.pwfunction help(){ echo "usage : pw [create|sftp|{searchKey}]" echo " create 依据命令行提醒创立连贯" echo " sftp 进入sftp模式" echo " searchKey 依据关键字进行含糊搜寻链接反对依照分组名称,连贯名称,ip进行搜寻" echo " help 帮忙信息"}function init(){ if [ "$PW_HOME" != "" ]; then v_pw_home=$PW_HOME fi mkdir -p $v_pw_home}function login(){ v_login_host=$1 v_login_name=$2 v_login_pwd=$3 v_action=$4 printf "\e[0mlogin to ➡ %s with user %s ....\n" $v_login_host $v_login_name v_script="sshpass -p $v_login_pwd $v_action ${v_login_name}@${v_login_host}" osascript -e 'tell application "Terminal" to activate' -e 'tell application "System Events" to tell process "Terminal" to keystroke "t" using command down' -e 'tell application "Terminal" to do script "'"$v_script"'" in selected tab of the front window'}initcmd=$1if [ "${cmd}" = "help" ]; then help exit 0fiv_action=sshif [ "${cmd}" == "create" ]; then read -p "➜ 分组 : " v_group read -p "➜ ip : " v_host read -p "➜ 名称 : " v_name read -p "➜ 登录名: " v_username read -p "➜ 明码 : " v_password if [ "$v_host" == "" ]; then echo "ip地址不能为空" exit 1 fi if [ "$v_name" == "" ]; then echo "名称不能为空" exit 1 fi if [ "$v_group" == "" ]; then v_group="default" fi echo ${v_host},${v_username},${v_password} >$v_pw_home/${v_group}-$v_host-${v_name}.kimy echo "增加主机 "${v_host}" 胜利" exit 0fiif [ "${cmd}" == "sftp" ]; then v_action=sftp cmd=$2fiv_search_key="*.kimy"if [ "$cmd" != "" ]; then v_search_key="*${cmd}*.kimy"fiv_sequence=1printf "服务器列表\n"for f in $(find $v_pw_home -name ${v_search_key}|sort)do v_file_name=$(basename ${f}) v_names=(${v_file_name//-/ }) v_group='' v_host='' v_nick='' v_index=1 for i in ${v_names[@]} do if [ "$v_index" == "1" ]; then v_group=$i fi if [ "$v_index" == "2" ]; then v_host=$i fi if [ "$v_index" == "3" ]; then v_nick=(${i//.kimy/}) fi v_index=`expr $v_index + 1` done printf "\e[0m%-4s" $v_sequence"." printf "\e[32m%-12s" $v_group printf "\e[0m ➡ \e[35m%s(%s)\n\e[0m" $v_host $v_nick v_sequence=`expr $v_sequence + 1`doneprintf "\n"read -p "➜ 输出编号 : " v_machine_idv_sequence=1for f in $(find $v_pw_home -name $v_search_key|sort)do if [ "$v_machine_id" == "$v_sequence" ]; then v_content=`cat ${f}` v_sps=(${v_content//,/ }) v_host='' v_name='' v_password='' v_index=1 for i in ${v_sps[@]} do if [ "$v_index" == "1" ]; then v_host=$i fi if [ "$v_index" == "2" ]; then v_name=$i fi if [ "$v_index" == "3" ]; then v_password=$i fi v_index=`expr $v_index + 1` done login $v_host $v_name $v_password $v_action fi v_sequence=`expr $v_sequence + 1`done
脚本装置
将脚本保留到本地,比方/you/path/pwoerterminal/pw.sh
,在~/.bash_profile
退出以下内容
alias pw='/you/path/pwoerterminal/pw.sh'alias pwf='/you/path/pwoerterminal/pw.sh sftp'PW_HOME=/you/path/pwoerterminal/dataexport PW_HOME
- pw定义pw命令不便调用,这样你就能够在任何中央执行pw进入脚本
- pwf定义sftp命令不便调用,这样你就能够输出pwf进入sftp模式
- PW_HOME:保留数据的中央
批改后执行~/.bash_profile
令其失效
成果
其余问题
- 抉择复制性能目前是无奈实现,貌似须要借助插件,这里就不折腾了
- 这里明码是明文保留,有肯定的安全性问题