前言

每次想登录一台吃灰的服务器的时候,都要想半天 host + password(找各种备忘录),于是乎想写一个小脚本来管理它们,虽然通过编辑 /.ssh/config 文件也可以实现类似功能,但是每次添加或者查看都还是需要去 cd xxx & vim xxx,作为 新脚本小子,肯定得更 优雅 一点才行。

内容

github: ssh-manager

#!/bin/bash
command=$1
path=~/.ssh/sshm/
add(){
    read -r -p "server name:" server_name
    read -r -p "server host:" server_host
    read -r -p "server port(22):" server_port
    read -r -p "server user(root):" server_user
    read -r -p "server password:" server_password

    if [[ -z "$server_name" || -z "$server_host" ]]
    then
    	echo "server_name or server_host does not exist"
    	exit;
    fi

    server_port=${server_port:-22}
    server_user=${server_user:-"root"}

	if [ ! -d $path ]
	then
		( mkdir $path )
	fi

	if [ ! -f $path$server_name ]
	then
		( touch $path$server_name )
	else

		read -r -p "server_name [$server_name] already exists, overwrite [o] or enter new server_name: " action
		if [ ! $action ]
		then
			exit
		fi

		if [ $action == "o" ]
		then
			echo "" > $path$server_name
		else
			if [ $server_name == $action ]
			then
				echo "server_name already exists!"
				exit
			else
				server_name=$action
			fi
		fi

	fi

    echo "server_name=$server_name" >> $path$server_name
    echo "server_host=$server_host" >> $path$server_name
    echo "server_port=$server_port" >> $path$server_name
    echo "server_user=$server_user" >> $path$server_name
    echo "server_password=$server_password" >> $path$server_name
}

ls(){
	for file in $path*
	do
		while read line
		do
		    eval "$line"
		done < $file
	    echo "`basename $file`: $server_host"
	    unset server_host
	done
}

login(){
	if [ ! -f $path$1 ]
	then
		echo "server_name [$1] does not exist"
		exit
	fi
	while read line
	do
	    eval "$line"
	done < $path$1
	expect -c'
	spawn ssh -p '$server_port' '$server_user'@'$server_host'
	expect {
		"*yes/no" { send "yes\r"; exp_continue}
		"*assword:" { send "'$server_password'\r" }
	}
	interact
	'
}

delete(){
	read -r -p "do you want to delete [y] ?" action
	if [ "$action"x == "y"x ]
	then
		rm -rf $path$1
	fi
	exit
}

case $command in
  (add)
     add
     ;;
  (ls)
     ls
     ;;
  (rm)
     delete $2
     ;;
  (*)
     login $command
     ;;
esac

用法

chmod +x ./sshm.sh

global use

cp sshm.sh /usr/local/bin/sshm
# use just like:
sshp ls

add

sshm add

list

sshm ls

login server

sshm server_name

delete

sshm rm server_name

结束