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