🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
bash

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

Solaris

Solarisは、SunSoft社が開発・販売を行っているUnix系のOSです。Sun Microsystems社製コンピュータで動作し、またPC/AT互換機で動作するバージョンもあります。旧名称は「SunOS」ですが、現在はSolarisのカーネル部分をSunOSと呼んでいます。

Q&A

解決済

1回答

3014閲覧

Expectコマンドでキーワード検出が出来ない

choro-s

総合スコア118

bash

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

Solaris

Solarisは、SunSoft社が開発・販売を行っているUnix系のOSです。Sun Microsystems社製コンピュータで動作し、またPC/AT互換機で動作するバージョンもあります。旧名称は「SunOS」ですが、現在はSolarisのカーネル部分をSunOSと呼んでいます。

0グッド

0クリップ

投稿2020/12/14 10:24

お世話になります。

現状と困っていること。

現在、Solarisサーバを起点に複数のRHEL7サーバへWarファイルの
SCP転送を行おうとしております。

シェル配置先のサーバは運用中の環境にいるため、sshpassの導入や、
公開鍵での作成が出来ないことから
Solarisに入っているExpectコマンドを使用して接続を行いたいと考え、ツールを作成しています。
しかしながら、expect句でパスワードを引っかけることが出来ずエラーとなっている状況です。

なお、プロンプト上から
以下コマンドを手打ちすると問題なく通るため、さらに???となっている次第です。

bash

1OSPASSWORD='PASSWORD!' 2 3expect -c " 4set timeout 15 5spawn /usr/bin/scp ${SOURCE_PATH} ${USERNAME}@${TARGETIP}:${TARGET_PATH} 6expect { 7 \"Are you sure you want to continue connecting (yes/no)?\" { 8 send \"yes\n\" 9 expect -nocase \"password\" { 10 send \"${OSPASSWORD}\n\" 11 } 12 } 13 \"password\" { 14 send \"${OSPASSWORD}\n\" 15 } 16} 17interact 18"

上記コマンドをシェルスクリプトへ取込み、
sh -x にて実行した結果が以下の通りとなります。

[TESTUSER@HOST] $sh -x AAAA.sh --- 前略 --- + /usr/bin/expect -c $'\nset timeout 10\nspawn /usr/bin/scp /var/tmp/testdir/test.war USERNAME@192.168.XXX.XXX:/tmp/\nexpect "Are you sure you want to continue connecting (yes/no)?" {\n send "yes\n"\n expect "password:"\n send "P@SSW0RD!\n"\n} expect "password:" {\n send "P@SSW0RD!\n" \n}\ninteract\n' spawn /usr/bin/scp /var/tmp/testdir/test.war USERNAME@192.168.XXX.XXX:/tmp/ USERNAME@192.168.XXX.XXX's password: [TESTUSER@HOST] $

上記の通り、パスワードを引っかけることなくタイムアウトして抜けてきてしまう状態です。
※一部情報を伏せております。

環境情報

SCP送信元: Solaris 11.3(bash 4.4.11)
SCP受信先: RedHat Enterprise Linux 7.4

試したこと

・プロンプト上から直接、コマンドを実行
⇒正常に処理が行われ、対象先に転送されていることが確認できた。

・"password:"の部分を「USERNAME@192.168.XXX.XXX's password:」に修正した上で実行
⇒事象に変化なし(転送できず)

Solaris環境と言うこともあり、Linux bashでは出来ることが出来なかったりして困っております。
皆様の知恵をお貸しください。

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

passwordの文字列の後に別の文字列が出力されて、それから入力する必要があると思うので、sleepを入れてみてはどうでしょうか。

投稿2020/12/14 14:04

otn

総合スコア85886

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

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

choro-s

2020/12/15 03:00 編集

回答ありがとうございます。 中のexpect前にsleepを入れても事象解決しませんでしたが、 sendの後にsleepを入れたところ、後続処理が実行されました。 どうやら、send処理を行った後、 そのままプロセスが終了していたようです。 それを待つことで事象が解決出来ました。 修正結果については以下のようになりました。 expect -c " set timeout 15 spawn /usr/bin/scp ${SOURCE_PATH} ${USERNAME}@${TARGETIP}:${TARGET_PATH} sleep 2 expect \"Are you sure you want to continue connecting (yes/no)?\" { send \"yes\n\" sleep1 expect -nocase \"password\" send \"${OSPASSWORD}\n\" } \"password\" { send \"${OSPASSWORD}\n\" } sleep 2 interact " 本当にありがとうございました!
otn

2020/12/15 09:05

> expect前にsleepを入れても事象解決しませんでしたが、 何故そこに? sendの前でしょう。 > そのままプロセスが終了していたようです。 それはパスワードがエラーになっていたからでしょうね。
choro-s

2021/01/21 00:37

回答が遅くなり申し訳ありません。 >何故そこに? >sendの前でしょう。 年が明けてから、改めて処理の確認とソースの見直しを実施しました。 パスワード入力内容も確認した上で sleepの位置をsendの前後においてそれぞれの挙動を試したのですが sendの前に配置した状態では、scp処理が完了する前にプロセスが終了してしまう 事象が再発しております。 sendの後に配置した状態だと、scp処理が正常に完了し 転送先にファイルが配置できていることまで確認致しました。 細かい調査に時間を割けていませんが、取り急ぎご報告まで。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問