質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

Q&A

解決済

1回答

309閲覧

sshコマンドのラッパーで、'ユーザー@ホスト'の部分だけ捕まえたい。

teityura

総合スコア84

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

0グッド

1クリップ

投稿2018/10/13 06:13

編集2018/10/13 15:46

sshのラッパーを作成し、
alias ssh="${HOME}/bin/my_ssh" としておき、ssh hoge を実行すれば、
my_ssh内で、sshpass -p hogehoge hoge が実行されるようにしています。

しかし、ssh -v hoge など、
オプションをつけて実行する場合に対応できていません。

getopts等で、'ユーザー@ホスト'の部分だけ抜き取る方法はないでしょうか。
while getopts vTo... OPT
do
case $OPT in
v) #xxxx ;;
T) #xxxx ;;
esac
done
shift $((OPTIND - 1))
とする以外にどんな方法があるのでしょうか。

bash

1if [[ $1 =~ .*@.* ]] ; then 2 USER=$(echo $1 | awk -F '@' '{print $1}') 3 HOST=$(echo $1 | awk -F '@' '{print $2}') 4 TARGET="${USER}@${HOST}" 5else 6 HOST=$1 7 TARGET=$HOST 8fi 9case ${HOST} in 10 hoge) 11 sshpass -p hogehoge $TARGET 12 192.168.*) 13 /usr/bin/ssh $TARGET

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

やりたいことがよく分かりませんが、こういうことでしょうか?

Bash

1OPT= 2for arg 3do 4 case "$arg" in 5 -*) OPT="$OPT $arg" ;; 6 *@*) USER=${arg%%@*} 7 HOST=${arg##*@} 8 TARGET="$arg" ;; 9 *) HOST="$arg" 10 TARGET="$arg" ;; 11 esac 12done 13case "$HOST" in 14192.168.*) 15 echo /usr/bin/ssh $OPT "$TARGET" ;; 16hoge) 17 echo sshpass -p hogehoge $OPT "$TARGET" ;; 18esac

#別案

Bash

1args=("$@") 2for((i=0; i<${#args[@]}; i++)) 3do 4 arg="${args[i]}" 5 case "$arg" in 6 *@*) 7 args[i]= 8 USER=${arg%%@*} 9 HOST=${arg##*@} 10 TARGET="$arg" ;; 11 hoge|hage) 12 args[i]= 13 HOST="$arg" 14 TARGET="$arg" ;; 15 esac 16done 17case "$HOST" in 18hoge) 19 sshpass -p hogehoge ${args[@]} "$TARGET" ;; 20hage) 21 sshpass -p hagehage ${args[@]} "$TARGET" ;; 22*) 23 /usr/bin/ssh ${args[@]} "$TARGET" ;; 24esac

投稿2018/10/13 09:46

編集2018/10/14 02:15
otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teityura

2018/10/13 15:55

私がしたいのは、ssh オプション ホスト名 を実行した際、 オプション ホスト名 をそのままに、 ホストに対応するパスワードをsshpass に与えて実行する ということでした。 %%, ## による最短最長除外、勉強になります。 大体、下記のようにしてみました。 ただ、ssh -o StrictHostKeyChecking=no hogehost のように、オプションが引数をとる場合に対応できないのが惜しいです。 =================================== # check OPT opt='' for arg do case "$arg" in -*) opt="$opt $arg" ;; *@*) USER=${arg%%@*} HOST=${arg##*@} TARGET=$arg ;; *) HOST=$arg TARGET=$arg ;; esac done opt=${opt#* } # check HOST case "${HOST}" in hogehost) sshpass -p hogepass /usr/bin/ssh $TARGET $opt ;; ===================================
teityura

2018/10/13 15:57

あと、forの部分ですが、 for i in aa bb cc や for ((i=0; i<5; i++)) でなく、 for arg で動作してるのも、初めて知りましたし、 実は、今もあんまり理解できてません。
otn

2018/10/14 01:58

引数付きオプションに対応するためには、getoptsをつかうか、caseで分岐するかですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問