在windows中,有諸如XShell,SecureCRT等ssh鏈接神器,但在Mac中,可選擇的工具並很少,ITerm2被一衆程序員吹上了天,但本身實際用下來並很差用,對終端的執念讓我基本上嘗試了全部在Mac上能找獲得的終端工具,最終選擇了termius,該工具界面有點極客風,設計簡潔,鏈接速度快,惋惜的是若是用戶退出全部記錄將被清除,在被清除兩次後終於無奈的放棄了Mac下惟一上手的終端工具,放棄termius後卻很難再找一個滿意的終端,mac自帶的終端其實還行,就是不大好用,理想中的終端應該知足如下功能git
若是mac自帶終端可以知足以上需求,就徹底能夠用於平常開發,那麼接下來咱們就一步步改造終端程序員
用過ssh終端的都知道,若是網絡斷開或者長時間不操做,會致使終端掉線,表現爲鍵盤無響應,須要從新鏈接,有時候咱們在服務器工做目錄下,從新登陸又要切換到當前目錄,很是到不方便,所以通常終端均可以配置一個心跳檢測,終端會定時發送心跳包保持鏈接,Mac終端也提供了該配置,編輯文件/etc/ssh/ssh_config
增長如下配置github
$ sudo vi /etc/ssh/ssh_config ServerAliveInterval 60 ServerAliveCountMax 999
另外/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
修改後執行~/.bash_profile
令其生效