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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

3回答

1899閲覧

シェルにてexpect コマンドを使ってのsshのネスト

wi2yuki

総合スコア19

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2018/07/30 06:53

編集2018/07/30 07:25

前提・実現したいこと

expectコマンドを使って、sshのネストをしようとしております。
最終ゴールはサーバDにsshログインすること。

  • サーバA→サーバB→サーバB→サーバD

とサーバを踏み台にして、sshログインを行おうとしています。
※社内ネットワークの特性上、サーバDにいくためには、上記の順にsshしていくしかない。

発生している問題・エラーメッセージ

サーバBへログインするところで

user1@サーバB's password:

とコンソールに出力されて止まってしまいます。

該当のソースコード

shell

1#!/bin/bash 2 3expect -c " 4################################ 5# サーバA 6################################ 7spawn ssh user1@サーバA 8expect \"password:\" 9send \"abcde\" 10 11################################ 12# サーバB 13################################ 14spawn ssh user1@サーバB 15expect \"password:\" 16send \"abced\" 17 18################################# 19# サーバC 20################################# 21spawn ssh user1@サーバC 22expect \"password:\" 23send \"abcde\" 24 25################################# 26# サーバD 27################################# 28spawn ssh user1@サーバD 29expect \"password:\" 30send \"abcde\" 31 32interact 33"

試したこと

spawn_idを取得して-iオプションに指定すればうまくいく記事をwebで見つけて試したが、
spawn_idを取得できず。

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

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

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

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

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

guest

回答3

0

単に多段にsshするだけなら、

ssh -t userA@serverA ssh -t userB@serverB ssh -t userC@serverC ssh userD@serverD

を spawn するだけでできます。
パスワード入力が段数分必要になりますので、それだけ expect-send を用意する感じで。
※一度手動でコマンドを実行してみて下さい

投稿2018/07/30 10:41

angel_p_57

総合スコア1672

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

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

wi2yuki

2018/07/31 01:07

パスワード認証である必要はなかったので、鍵認証することにしました! ありがとうございます。
guest

0

ベストアンサー

expect でやるのであれば、サーバBへのログインはサーバAで expect の実行が必要になる気がします。
順に各サーバで次のサーバ向けの expect の実行が必要になるんじゃないでしょうか。

別のやり方としては「多段SSH」とかをキーワードに検索するといいかと思いますが、ssh コマンドにあるオプションを利用することでproxyとするサーバを指定して接続することができます。

http://sig9.hatenablog.com/entry/2016/07/05/230000 あたりを参考にしつつできないでしょうか。

投稿2018/07/30 07:44

kaz.Suenaga

総合スコア2037

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

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

wi2yuki

2018/07/30 08:19

ありがとうございます!!! 参考にさせていただきます<m(__)m> Jenkinsでのジョブ実行を考えており、expectなどでの対応が必要なのです、、、
kaz.Suenaga

2018/07/30 09:08

そういった用途であれば最初のサーバは仕方ないとして、入った先のサーバ側にシェルスクリプトでも組んでおいてそれを実行するのが楽なんじゃないでしょうか。 あと、SSH公開鍵認証を利用することで認証時にコマンドを自動実行させる設定があるので、限られた用途ならそれが楽かもしれません。 http://takuya-1st.hatenablog.jp/entry/20110813/1313252992 あたりが参考になるかもしれません。
wi2yuki

2018/07/31 01:06 編集

はい、鍵認証することにしました! アホンダラでした、、、 ありがとうございます。
guest

0

代替案として。

expectで踏み台一個ずつのパスワードを入れていくのではなく、
SSHのポートフォワード機能を使ってみてはいかがでしょうか。

投稿2018/07/30 07:32

kazto

総合スコア7196

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

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

wi2yuki

2018/07/30 07:50

ありがとうございます!!!!!!! 試してみます<m(__)m>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問