LoginSignup
1
0

More than 3 years have passed since last update.

SSH 接続情報をメニュー選択するシェルを作成したみた

Last updated at Posted at 2019-07-26

0.はじめに

サーバーへの SSH 接続に、Chrome 使ったり、Cyberduck 使ったりしてたんですが…、

Chrome のキャッシュが飛んで、接続情報が無くなってしまったり…、
Cyberduck がたまに使えなくなったりと…、
何か色々と困った事が起きたので…、基本に戻ってシェル使おうかなと思って作ってみました。

1.事前準備

※特に無し。

2.プログラム

  1. SSH 接続プログラム (.command)
SshConnect.command
#!/bin/bash

MyBase=`dirname ${0}`

# bashのshellで2次元配列を使ってHTMLのテーブルを作る方法 - Qiita
# https://qiita.com/ponsuke0531/items/86df8752d8a4c4e9ca92

dataArray=(
#TiTle             #Host                       #Port    #User       #Identifier                             #Password
"'タイトル'        'ホスト'                    'ポート' 'ユーザー'  '鍵ファイルパス'                        'パスワード'"
"'XXXXXXXX'        'XXX.XXX.XXX.XXX'           'XXXXX'  'XXXXXXXX'  '/XXXX/XXXX/XXXX.pem'                   'XXXXXXXX'"
)

OLDIFS=${IFS}

IFS=$'\n'
for i in "${dataArray[@]}"; do
  IFS=$'\''
  DATA=(${i[@]})
  TITL=${DATA[1]}
  HOST=${DATA[3]}
  PORT=${DATA[5]}
  USER=${DATA[7]}
  FILE=${DATA[9]}
  PSWD=${DATA[11]}
  REC=`printf "%-24.24s %-32.32s %-8.8s %-16.16s %s" ${TITL} ${HOST} ${PORT} ${USER} ${FILE}`
  LIST="${LIST}\n${REC}"
done

IFS=$'\n'
PS3="What do you use ? >"
select ANS in `echo  -e "${LIST}"`
do
  IFS=${OLDIFS}
  if [ -z "${ANS}" ]; then
    continue
  else
    break
  fi
done
echo

IFS=$'\''
DATA=(${dataArray[$((REPLY-1))]})
TITL=${DATA[1]}
HOST=${DATA[3]}
PORT=${DATA[5]}
USER=${DATA[7]}
FILE=${DATA[9]}
PSWD=${DATA[11]}

IFS=${OLDIFS}
PS3="SSH or SFTP ? >"
select ANS in "SSH" "SFTP"
do
  if [ -z "${ANS}" ]; then
    continue
  else
    break
  fi
done
echo

CMD=""
case "${REPLY}" in
  "1" ) CMD="ssh -oStrictHostKeyChecking=no -oPort=${PORT}" ;;
  "2" ) CMD="sftp -oStrictHostKeyChecking=no -oPort=${PORT}" ;;
esac
if [ -n "${FILE}" ]; then
  CMD+=" -oIdentityFile=\"${FILE}\""
fi
CMD+=" ${USER}@${HOST}"

# Linuxコマンド【 sftp 】安全なファイル転送 - Linux入門 - Webkaru
# https://webkaru.net/linux/sftp-command/

# シェル以外からexpectしててハマったメモ - blog::wnotes.net
# https://blog.wnotes.net/posts/expect-other-programs/

expect -c "
set timeout 5
spawn env LANG=C ${CMD}
expect -re \"Enter passphrase for key\" {
  send \"${PSWD}\r\"
} expect -re \".* password:\" {
  send \"${PSWD}\r\"
}
interact
"

3.設定

  1. .bash_profile
.bash_profile
alias sshconnect='〜〜〜/SshConnect.command'

99.ハマりポイント

  • シェルでの文字列の扱いでちょっと困ったぐらいかな。

XX.まとめ

これで、コマンド打てばシェルに登録されているホストへ、SSH も SFTP のどちらでも接続できる様になりました。

セキュリティ的に不安があれば、以下のコマンドを利用してキーチェーンからパスワードを取得するのもいいんじゃないかと思います。

良かったら使ってみて下さい。

それでは♪

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0