mac終端改造

背景

在windows中,有諸如XShellSecureCRT等ssh鏈接神器,但在Mac中,可選擇的工具並很少,ITerm2被一衆程序員吹上了天,但本身實際用下來並很差用,對終端的執念讓我基本上嘗試了全部在Mac上能找獲得的終端工具,最終選擇了termius,該工具界面有點極客風,設計簡潔,鏈接速度快,惋惜的是若是用戶退出全部記錄將被清除,在被清除兩次後終於無奈的放棄了Mac下惟一上手的終端工具,放棄termius後卻很難再找一個滿意的終端,mac自帶的終端其實還行,就是不大好用,理想中的終端應該知足如下功能git

  • 可以發送心跳包,不至於由於斷網或者閒置時間過長鏈接斷開須要重連
  • 可以有必定的管理功能,記住密碼,不用每次輸入地址和帳號,這個也是最重要的需求
  • 支持tab頁,支持分屏
  • 可以上傳下載文件
  • 顏值要高
  • 能夠選擇複製,由於在終端常常須要複製,大部分終端均可以選擇便可複製,無需手動ctrl+c

若是mac自帶終端可以知足以上需求,就徹底能夠用於平常開發,那麼接下來咱們就一步步改造終端程序員

心跳檢測

用過ssh終端的都知道,若是網絡斷開或者長時間不操做,會致使終端掉線,表現爲鍵盤無響應,須要從新鏈接,有時候咱們在服務器工做目錄下,從新登陸又要切換到當前目錄,很是到不方便,所以通常終端均可以配置一個心跳檢測,終端會定時發送心跳包保持鏈接,Mac終端也提供了該配置,編輯文件/etc/ssh/ssh_config增長如下配置github

$ sudo vi /etc/ssh/ssh_config

ServerAliveInterval 60
ServerAliveCountMax 999
  • ServerAliveInterval:發送心跳包間隔,單位秒
  • ServerAliveCountMax:最多發送多少次失敗就斷開鏈接

另外/etc/ssh/ssh_config文件中有SendEnv LANG LC_*配置,將服務器語言環境設置爲和本地同樣的環境,通常咱們本機是中文環境,但不必定全部Linux服務器都支持中文環境,有時候可能出現亂碼,所以這裏建議註釋掉該配置。shell

顏值

顏值真的就仁者見仁,mac終端提供了自定義主題的功能,在菜單終端->偏好設置windows

另外能夠編輯文件/etc/motd文件,自定義終端歡迎頁安全

你能夠也能夠安裝第三方shell,好比Oh My Zshbash

管理功能

這個需求是硬需求,不可能每次鏈接都從新輸入地址和帳號信息,得有個方案記錄用戶名和密碼,而且可以經過腳本得方式進行自動鏈接,ssh工具自己處於安全考慮不提供在命令行中指定密碼功能,也就是你不能經過相似ssh {password} {user}@{host}方式進行鏈接,必須手動輸入密碼,因此第一步就是解決自動登陸問題。服務器

自動登陸

sshpass就是解決ssh手動輸入密碼的問題,你能夠經過brew安裝sshpass網絡

brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

若是沒有安裝brew,你能夠下載源碼自行編譯安裝app

安裝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令其生效

效果

其餘問題

  • 選擇複製功能目前是沒法實現,貌似須要藉助插件,這裏就不折騰了
  • 這裏密碼是明文保存,有必定的安全性問題
相關文章
相關標籤/搜索