• 締切済み

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)を正しく変数として解釈させる方法をご教示いただけませんでしょうか?

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

setコマンドを使っているということは、ログイン先はcshということで合ってますか? expect ${1} ; send \"echo $val\r\" のところは、 expect ${1} ; send \"echo \$val\r\" に直せばいいと思います。\ を付けないと、このスクリプトを実行する環境での $val に置き換わります。

scubapro_
質問者

お礼

notnotさん コメントありがとうございます。 リモートシェルは、JUNOSが載ってるルータでcshではないのですが おっしゃる通りsetコマンド使わないといけないのでcsh系です ルータ側では問題ないのですがスクリプトを置けないため リモートからハンドルするしかなくて ご指示の通り$をエスケープしてみたんですが、実行結果は以下のようになりました % set val=20110202 % can't read "val": no such variable while executing "send "echo $val\r"" リモートホストに渡す前に$が解釈されてしまってるような気がします また、エスケープしていないときは以下の通りです % set val=20110202 % echo % exit exit

関連するQ&A

  • シェルスクリプト中のexpectで変数使う方法

    SolarisでshellにBashを使う環境で、リモートのルータに入り コンフィグを操作するscriptを書きたいと思っています。 1.引数に与えられたファイルから値を読み、変数$POLにセットする。 2.expectでルータにSSHし、変数$POLに入っている値を設定する。 3.上記をファイルの行数分繰り返す。 上記を実現しようと以下の様に書いたのですが expect内で変数が扱えません。 (ルータに$POLという文字列のまま送られてしまう) -- #!/usr/bin/bash HOST="192.168.0.100" for list in `cat $1` do POL=$(echo $list | cut -d , -f 1) /usr/local/bin/expect -c ' set timeout 5 spawn ssh -l cm01 $HOST expect "password:" send "hogehoge" expect "router $ " send "config firewall policy\r" expect "router (policy) $ " send "edit $POL\r" send "set firewall on\r" send "end\r" send "exit\r" ' done -- 色々と調べてみたのですが理由がわからず、お教えいただければ幸いです。

  • コマンド実行結果を変数に代入できない(shell)

    Kシェルを作成しており、以下のコマンドを変数に代入することができません。 DIR1=`ls ${SOURCE_FILE_PATH} | grep ${INTERFACE_ID} > /dev/null 2>&1` やりたいことは単純で、 ${SOURCE_FILE_PATH} に ${INTERFACE_ID}フォルダが存在するかを確認するために、実行結果をDIR1に格納したいだけです。 しかし、sh - xでデバッグすると、仮にフォルダがあったとしても、何も代入されず終わってしまいます。 パイプ処理やgrepを使用したコマンドを変数に代入する方法をご存知の方いらっしゃいましたらご教授願います。

  • コマンド実行結果を環境変数に代入する方法ありますか

    下記のとおりfindコマンドを実行すると結果が表示されます。 findコマンドの実行結果を直接環境変数に代入したいのですが、 できますでしょうか。 できれば「5」だけを環境変数に代入したいです。 よろしくお願いします。 C:\tmp>find /C "OPEN" aaa.txt ---------- AAA.TXT: 5

  • 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のなかでダラーを読ませる方法をしりませんでしょうか。

  • コマンドの戻り値を変数に代入したい

    初歩的な質問で失礼します。 echo "aiueo" > 変数 というようなことをやりたいのですが、できますでしょうか? 具体的には、ftpコマンドのメッセージを 変数に代入したいなと思っています。 echo "(略)" | ftp -n > 変数

  • コマンドの結果を変数へ代入@シェルスクリプト

    Linux初心者です。 標記のとおり、シェルスクリプトで、コマンドの結果を変数へ代入することはできるでしょうか? 目的は、あるプログラムの開始時間から終了時間までの経過時間を計算して表示することです。時間を変数に代入しておいて計算したいのですが、方法がわかりません。(入出力のリダイレクト(|や>)、コマンドを引数に渡す方法(``)はわかったのですが...) よろしくお願いいたします。

  • シェルでコマンドの実行結果を変数に格納する方法

    以下のようなコマンドライン引数を取得するシェルを書いたのですが 実行時にエラーになってしまいました。コマンド(第2引数以降を取得するコマンド)の実行結果を変数に格納するところでエラーになってしまいました。どのようにすればよろしいでしょうか。 「./test2.sh a b c d e」を実行し「a: コマンドが見つかりません」 というエラーが出てしまいます。 (test2.shの内容) #!/bin/sh OUTPUTFILE=$1 SRC_FILES=`"$@" | cut -d ' ' -f 2-` # 第二引数以降を取得 echo $OUTPUTFILE ←ここは表示される echo $SRC_FILES ←ここでエラー

  • UNIXでのEXPECTの使い方

    時間が来たら動くシェルを作っています。 コピー元ホストのloot/ABC/aaa.tarを、 コピー先ホストのloot/DEF/aaa.tarにSCPコマンドでコピーしたいのですが、 passwordを求められるので、EXPECTを使って、自動化しようとしてるんですけど、いまいちEXPECTの使用方法が分かりません・・・。 とりあえず作ったソースです。↓passwordは『saru』です。 expect ” spawn scp コピー元ホスト ABC/aaa.tar      コピー先ホスト DEF/aaa.tar expect { ¥”Are you sure you want to continue connecting (yes/no)?¥” { send ¥”yes¥r¥” expect ¥”password:¥” send ¥”(saru)¥r¥” } ¥”password:¥” { send ¥”(saru)¥r¥” } } interact ” 何がいけないのか全然分かりません。 どのようにしたら、passwordを書かないで、コピー 出来るようになりますか??

  • シェルスクリプの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はそもそも使えないのでしょうか。 無知な質問かもわかりませんがお気づきの点があればご指摘いただけないでしょうか。 よろしくお願いします。

  • コマンドの結果を変数に入れたい

    現在のホスト名をhostnameコマンドで表示させられますが、この結果を変数に格納することはできますか? set PCName=hostname set PCName=%hostname% と実行しても、上手くいきませんでした。 理由は、ホストネームはよく利用するので、変数に格納したいからです。 毎回、hostnameコマンドを実行し、マウスで範囲を選択し、コピー&ペーストでやって来ましたが、もう少し効率よく出来ればよいなと思い質問させていただきました。 分かる方いらっしゃいましたら、お願いいたします。