乐趣区

关于macpro:mac终端改造

背景

在 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_config

ServerAliveInterval 60
ServerAliveCountMax 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 后,能够通过以下命令登录服务器

# 登录 ssh

sshpass -p "password" ssh user@host

# 登录 sftp

sshpass -p "password" sftp user@host

治理

解决了主动登录问题,那么就必须有中央治理连贯,其实就是把其余终端工具的界面操作搬到控制台实现,咱们假如有一个工具叫 PowerTerminal 简称 pw,pw 提供以下性能


# 创立新连贯

pw create $ 连贯名称 $ip $ 用户名 $ 明码

# 列出所有连贯

pw

# 依据关键字搜寻连贯

pw $ 关键字

# 在显示所有连贯后能够依据编号抉择连贯某个连贯

# sftp

pw 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.com

v_pw_home=~/.pw

function 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'
}

init

cmd=$1


if ["${cmd}" = "help" ]; then
    help
    exit 0
fi

v_action=ssh

if ["${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 0
fi
if ["${cmd}" == "sftp" ]; then
    v_action=sftp
    cmd=$2
fi
v_search_key="*.kimy"
if ["$cmd" != ""]; then
    v_search_key="*${cmd}*.kimy"
fi
v_sequence=1
printf "服务器列表 \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`
done

printf "\n"

read -p "➜ 输出编号    :" v_machine_id

v_sequence=1
for 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/data
export PW_HOME
  • pw 定义 pw 命令不便调用,这样你就能够在任何中央执行 pw 进入脚本
  • pwf 定义 sftp 命令不便调用,这样你就能够输出 pwf 进入 sftp 模式
  • PW_HOME:保留数据的中央

批改后执行 ~/.bash_profile 令其失效

成果

其余问题

  • 抉择复制性能目前是无奈实现,貌似须要借助插件,这里就不折腾了
  • 这里明码是明文保留,有肯定的安全性问题
退出移动版