• 締切済み
  • 困ってます

シェルスクリプのexpect部分のコマンド実行方法

シェルスクリプトのexpect -c以降の記述について相談させて下さい。 特定機器へのログインを行う場合に以下のパターンがあります。 パターン1 user=user PW=pass1 パターン2 user=user PW=pass2 ※プロンプトはuser@としています パターン1でログインできた場合はcommand Aを実行して終了 パターン2でログインできた場合はcommand Aを実行して終了 パターン1も2もログインできない場合即終了を期待して下記プログラムを作成しました。 expect -c " -略- expect \"Login:\" send \"user\n\" expect \"Password:\" send \"pass1\n\" sleep 1 expect { \"Login incorrect\" { send \"user\n\" expect \"Password\" send \"pass2\n\" expect { \"Login incorrect\" { exit 1 } \"user@\" { send \"command A\n\" expect \"user@\" send \"quit\n\" exit 1 } } } } \"user@\" { send \"command A\n\" expect \"user@\" send \"quit\n\" } } interact " しかし、上記のbraceでかこったsend部分がうまくコマンドとして実行されません。 別ファイルで#!/usr/bin/expectexpectの記述で記載すると動作する点は確認しています。 #!/usr/bin/bashにおいてexpect -cから記載するとbraceはそもそも使えないのでしょうか。 無知な質問かもわかりませんがお気づきの点があればご指摘いただけないでしょうか。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数468
  • ありがとう数0

みんなの回答

  • 回答No.1

こういう感じではどうでしょうか。 http://pastebin.com/ESPADAVy

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • expectでコマンド実行結果を変数に代入出来ない

    test.sh #!/bin/sh expect -c " set timeout -1 spawn telnet $1 expect "login:" ; send \"username\r\" expect "sword:" ; send \"password\r\" expect ${1} ; send \"start shell\r\" expect ${1} ; send \"set val=`date +%Y'-'%m%d`\r\" expect ${1} ; send \"echo $val\r\" expect ${1} ; send \"exit\r\" expect ${1} ; send \"exit\r\" exit " 例えばリモートホスト側で コマンド date +%Y'-'%m%d の実行結果を valに代入したいのですが 代入結果をechoコマンドで表示させても上記コマンド実行結果が 変数に代入されていないのか何も表示されません リモートホストに変数valを表示させるのがうまくいっていないんじゃないかと 思うのですが特殊文字($val)を正しく変数として解釈させる方法をご教示いただけませんでしょうか?

  • expectを使って自動でSSHログインした後にコマンドを実行したいと

    expectを使って自動でSSHログインした後にコマンドを実行したいと思っています。 df -hやmailqのようなコマンドは問題ないのですが、awkを利用してダラー?"$"を 入れてフィールド操作しようとするとダラーだけうまく読み込んでくれないのです。 ■以下スクリプト ------------------------------------------------------------ read key COMMAND="$key" expect -c " set timeout 3 spawn ssh アカウント@ドメイン expect sword: send パスワード\r sleep 1 expect -re \"$\" send \"${COMMAND}\r\" expect logout: close " ※クローズも正しくないみたいですが、無理やりtimeoutで閉じれているのでとりあえず。。 ■実行結果 ------------------------------------------------------------ spawn ssh アカウント@ドメイン アカウント@ドメイン's password: can't read "NF": no such variable while executing "send "sudo awk '$NF>0' /proc/user_beancounters\r"" echoでCOMMANDを表示させるとちゃんと代入されているのです。 これがダラーを使わずに'{ptint}'とすれば問題ありません。となると awkは問題ないので、やはり問題はダラーにあると思います。 バックスラッシュを入れてエスケープしてもダラーを二つ並べてもできません。 read "NFとなっているので、明示的に数字を入れてフィールドを指定してもだめです。 どなたかexpectのなかでダラーを読ませる方法をしりませんでしょうか。

  • expectを用いた正規表現[]のgrepについて

    題名のとおり、expectを用いた正規表現のgrepをしたいのですが、 以下のように記述し、入力し、実行すると expect -c " spawn ssh ~~~ expect \"password:\" send \"hogehoge\n\" expect \">\" send \"zgrep "探したいもの" /なんかのログ.log.gz | grep -v "[0-9]%"\n\" expect \">\" send \"exit\n\" " 以下のようにエラーが出てしまいます。 invalid command name "1-9" while executing "1-9" invoked from within [0-9]この部分を\[0-9\]このようにエスケープしてみても同じエラーが出てしまい、実行できません。 どのようにすれば正規表現として認識してくれるのでしょうか。 以上よろしくお願いいたします。

  • Ubuntu expectコマンド

    端末でのexpectコマンドの使い方がわからないので質問します。 Windows10で WSLを使い、Ubuntuを使っています。Postgresqlをインストールし、 sudoコマンドでPostgresqlを起動しているのですが、パスワードの入力を自動化したくて、expectコマンドを使ったのですが、エラーが出てしまいました。端末に入力したコマンドは下記です。 expect -c "spawn sudo service postgresql start;expect [sudo] user01 のパスワード:;send パスワード\n ;interact" エラーは次のようになりました。 spawn sudo service postgresql start invalid command name "sudo" while executing "sudo" invoked from within "expect [sudo] user01 のパスワード:" どなたか、端末からexpectコマンドを使ってPostgresqlを起動する書き方を教えてくださいお願いします。

  • expectを使用しない対話型処理

    シェルスクリプトにおける、対話型(adduser、passwd)の処理を自動化したいと考えております。 expectを使用すれば簡単なのですが、新たにインストールしないといけないパッケージが数個あるため、避けたいと考えております。 そこで質問です。 expectを使用しなくても、対話型の処理を自動化できる方法はありますでしょうか。違う言い方をすれば自動化するプログラムを作成できるのかということになります。 ちなみにヒアドキュメントを使用しましたが下記のようになってしまい、うまくいきません。 いろいろと助言していただけると光栄です。 プログラム----- !/bin/sh user_name1="oshietegoo" user_pass1="kaiketsu" adduser $user_name1 << E $user_pass1 $user_pass1 E --------------- 結果----------- Changing password for oshietegoo New password: Retype password: passwd: password for oshietegoo is unchanged --------------- よろしくお願い致します。

  • ProFTPDでanonymousFTPサーバ

    ProFTPDでanonymousFTPサーバを立てたいのですが、ログインできなくて困ってます。 環境 RedHat7.2 ProFTPD1.2.5rc1 ルータ配下にRedHatが1台とwindows2000が1台あります。 状況 LAN内のWindows端末からffftpでログインしようとしています。 (1)anonymousでログインすると  「ログインできません。正しいパスワードを入力してください。」  というメッセージが出てきます。で、Linuxで設定してあるパスワードを  全部試しましたが、ログインできません。  ffftpのエラーログは以下の通りです。 FFFTP Ver.1.88a Copyright(C) 1997-2002 Sota. ---------------------------- ホスト 192.168.0.20 (21) に接続しています. 接続しました. 220 ProFTPD 1.2.5rc1 Server (MyFtp) [linux] >USER anonymous 331 Anonymous login ok, send your complete email address as your password. >PASS [xxxxxx] 530 Login incorrect. ログインできません. (2)他のLinuxユーザーアカウントでログインを試みると、問題なくOKでした。 # ftp localhost  でも同じでユーザーアカウントのみログオンOKで、 anonymousでログインすると以下のようになります。 [root@linux root]# ftp localhost Connected to localhost (127.0.0.1). 220 ProFTPD 1.2.5rc1 Server (MyFtp) [linux] Name (localhost:hogehoge): anonymous 331 Anonymous login ok, send your complete email address as your password. Password: 530 Login incorrect. Login failed. ftp> 原因のわかる方がいれば、ぜひ教えてください。 よろしくお願いします。

  • expectの構文について

    次のスクリプトを実行しました。 #!/bin/bash user="sarigennu" password="sarigennupassword" passwd="passwd" useradd $user; expect -c " spawn $passwd $user expect Enter\ send $password send \r expect Retype\ send $password send \r expect eof exit 0 " その結果として下のように標準出力されました。 どうしたら成功するでしょうか(一般ユーザのパスワードを変更できるようになるでしょうか?) spawn passwd sarigennu Changing password for user sarigennu. New password: BAD PASSWORD: it's WAY too short Retype new password: No password supplied No password supplied No password supplied passwd: Authentication token manipulation error

  • 自動パスワード入力でscpするスクリプトでエラー「Unterminated quoted string」

    Win2kのCygwinで下記のスクリプトを試してみました。 (ローカルのファイルをscpで自動転送) $ uname -a CYGWIN_NT-5.0 upsil 1.5.11(0.116/4/2) 2004-09-04 23:17 i686 unknown unknown Cygwin $ cat ./test.sh #!/bin/sh HOST=192.168.1.105 # scp するマシン名を設定 UNAME=user01 # ログイン名を設定 PASSWD=xxxxxxxx # パスワ-ドを設定 TARGET=/cygdrive/c/cygwin/home/root/hoge /usr/bin/zip -r $TARGET.lzh $TARGET expect -c " # expect コマンドを実行 set timeout 20 spawn scp -P 60001 $TARGET.lzh $UNAME@$HOST:/home/fat32/ # expect コマンドの管理下でscpを実行する expect login:\ ; send \"$UNAME\r\" # login: が出たらログイン名を打ち込む expect sword:\ ; send \"$PASSWD\r\" # password: が出たらパスワ-ドを打ち込む #expect \"$\" ; send \"ls\r\" # $ が出たら ls を打ち込む #expect \"$\" ; send \"exit\r\" # $ が出たら exit を打ち込む $ which expect /usr/bin/expect $ which zip /usr/bin/zip $ ./test.sh と実行すると : 9: Syntax error: Unterminated quoted string となり、終ってしまいました。 「expect -c " # expect コマンドを実行」 が問題みたいなのですが何がまずかったのでしょうか?

  • シェルスクリプトを使ったSCPのエラー

    お世話になります。 シェルスクリプトを使い、サーバAからサーバBへファイルを定期的にコピーしようと、以下のシェルスクリプトを作りました。 test.sh ================= #!bin/sh HOST1=hostB.com (さくらVPSサーバ) USER1=hugahuga PASS1=hogehoge TARGET_DIR1=/home/user/data/  #サーバB(転送先)のディレクトリ BACKUP_DIR1=/home/user/data_new/*  #サーバA(転送元)のディレクトリ expect -c " set timeout 30 spawn scp ${BACKUP_DIR1} ${USER1}@${HOST1}:${TARGET_DIR1} expect { \" Are you sure you want to continue connecting (yes/no)? \" { send \"yes\r\" expect \"password:\" send \"${PASS1}\r\" } \"password:\" { send \"${PASS1}\r\" } } interact " ================= sh test.sh すると、以下のようなエラーが出ます。。 /home/user/data_new/*: No such file or directory そのまんまだとは思うのですが、ファイルもディレクトリもありますし、上記スクリプトのSCPコマンド部分をコピペして、シェル上で実行すると普通にうまくいきます。 サーバAもBもUbuntu12.04です。 一体何が原因なのでしょうか・・

  • Ruby expect 条件文(if文)の書き方

    Rubyでexpectライブラリを利用して、対話的な処理を自動で行おうと思っています。 その場合に、条件文(if文)をどうやって書いていいのか分からず困っています。 ※条件文の必要のないサンプルプログラムは検索したところいろいろあったのですが・・・ 例えば spawn("ssh #{hostname}") do expect(/User \(.*\): /) { |match| user } expect(/[Pp]assword: /) { |match| pass } expect(/[\>\$] /) {|match| command } このcommmandの実行結果がAならば expect(/A/) {|match| command2 } そうではなくBならば expect(/B/) {|match| command3 } end ぜひよろしくお願いいたします。

    • ベストアンサー
    • Ruby