• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:expectを使って自動でSSHログインした後にコマンドを実行したいと)

expectを使ったSSHログインとコマンド実行の問題

このQ&Aのポイント
  • expectを使って自動でSSHログインし、コマンドを実行する際にダラーを正しく読み込めない問題が発生しています。
  • ダラーを使わずに'{print}'とすれば問題ないことが分かっていますが、ダラーを正しく読み込む方法を知りたいです。
  • バックスラッシュを入れてエスケープしたり、ダラーを二つ並べても解決できませんでした。明示的に数字を入れてフィールドを指定してもダメです。どなたか解決方法をご存知ありませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • u-kid
  • ベストアンサー率50% (34/67)
回答No.1

$の前にバックスラッシュ2つ付けてください。 keyの入力で ls -l | awk '{print \\$6}' のようにします。

r-linux
質問者

お礼

お礼遅れました! どうもです! おかげさまでダラーいけました ! ありがとうございますー

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • expectで複数台にログインしscpする。

    シェルの超初心者です。よろしくお願いします。 下記のようなシェルを作りたいのですがうまくいきません。 3台のパソコンA, B, Cがあるとします。 まず、AからBにssh接続し、シスログをAにscpします。 その後、AからCにssh接続し、シスログをAにscpします。 下記が、作成したものです。 どうぞ、アドバイスよろしくお願いいたします。 #!/usr/bin/expect set timeout 5 spawn ssh B@xxx.xxx.xxx.xxx expect "Enter passphrase for key" send "Password\n" spawn scp /var/log/messages A@xxx.xxx.xxx.xxx:/tmp/log01.log expect "password" send "Password\n" send "exit\n" spawn ssh C@xxx.xxx.xxx.xxx expect "Enter passphrase for key" send "Password\n" spawn scp /var/log/messages A@xxx.xxx.xxx.xxx:/tmp/log02.log expect "password" send "Password\n" send "exit\n" interact

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

  • 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部分のコマンド実行方法

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

  • [Linux]expectによるopenssl実行

    SSLを使用している自前のWebサイトに対する自動定期ポーリングを opensslを用いて実施しようとしています。 opensslは対話型プログラムですので、expectを用いて自動化することを考えました。 まず、手動でopensslを実行して表示されるメッセージを確認しました。 (入力コマンド)> openssl s_client -connect 192.168.1.1:443 (表示メッセージの末尾(改行コードはエスケープ表記しています)) ・ ・ Timeout : 300 (sec)\r\n Verify return code: 0 (ok)\r\n---\r\n そこで、自動化すべく以下のシェルを書いて実行してみたのですが、うまくいきません。 (opensslを実行したことによるSSLハンドシェイク完了のメッセージが流れた後、expectコマンドが終了します) expect -c " set timeout 10 spawn openssl s_client -connect 192.168.1.1:443 expect -- \"Verify return code: 0 (ok)\r\n---\r\n\" ; send \"GET /contents/index.jsp\r\" " expectのデバッグモード(-d)にて、"expect対象"として記載した文字列(Verify return code: 0 (ok)\r\n---\r\n)を認識しているところまでは確認しています。また、(タイムアウト設定の10秒を待たずに)expectが完了してコマンド待ちに戻るので、"send"も行われていると考えています。 --- コマンド等の不備や、そもそもexpect+opensslの組み合わせは不可、などございましたらご教示いただきたく思います。 なお、OSはCentOS 5.5です。

  • expectでscpのパスフレーズ入力を自動化

    別サーバーに存在するファイルを、scpでダウンロードしています。 これをcronを使用して自動実行させたいのですが、パスフレーズ入力の自動化で悩んでいます。 expectを使ってみましたが、以下のようにエラーもなく、反応でした。 expectの書き方が悪いのだと思いますが、ご教授いただけましたら助かります。 ○やりたいこと サーバーA(linux)から、サーバーB(linux, 192.168.1.100)のファイルをデイリーで自動ダウンロードしたい。 以下のtest.shを作って実行してみましたが、エラーも無く無反応です。 expectは導入されています。 ○環境 ・サーバーAからサーバーBへは、SSHでアクセスできる。 ・秘密鍵を/home/testuser/.ssh/に置いている。  ・サーバーBへは、パスフレーズを入力するだけでsshでログインできる。 ・パスワードでの認証はdisable ■手入力では、このようにファイルをダウンロードできています。 $ scp 192.168.1.100:/home/testuser/test.txt ./ Enter passphrase for key '/home/testuser/.ssh/id_dsa': ★ここでパスフレーズを手入力★ test.txt 100% 5 0.0KB/s 00:00 ■test.sh ----------- #!/bin/sh FILE=192.168.1.100:/home/testuser/test.txt TARGET=/home/testuser/ PASSWORD=hogehoge expect -c " set timeout 20 spawn scp $FILE $TARGET #expect \"Enter passphrase for key '/home/testuser/.ssh/id_dsa':\" ; #send \"$PASSWORD\r\"; " ■実行結果(エラー表示無し。ファイルはダウンロードされない) $ sh test.sh spawn scp 192.168.1.100:/home/testuser/test.txt /home/testuser/ $ 以上、よろしくお願いします。

  • 自動scpスクリプトでキーが書き換わった場合にexpectでのif文の書き方は?

    度々スイマセン。 自動パスワード入力でscpコマンドを実行させたく思っています。 Win2kのCygwinで下記のスクリプトを試してみました。 $ cat ./test.sh #!/bin/bash -x HOST=foo.hoge.dyndns.net UNAME=user01 PASSWD=xxxxxxxx TARGET=/cygdrive/c/cygwin/home/root/hoge /usr/bin/zip -r $TARGET.lzh $TARGET expect -c " set timeout 20 spawn scp -P 60001 $TARGET.zip $UNAME@$HOST:$DSTNTN ; expect \"password:\" ; send \"$PASSWD\r\" ; interact " で、成功しましたがキーが変わった時には「yes」と自動で入力させたくて expect -c " set timeout 20 spawn scp -P 60001 $TARGET.zip $UNAME@$HOST:$DSTNTN ; if [ expect \"Are you sure you want to continue connecting (yes/no)?\" ] then ; send \"yes\r\" ;# yesと入力する。 fi; expect \"password:\" ; send \"$PASSWD\r\" ; interact " としてみたのですがキーが書き換わっていない場合(いきなりパスワードが聞かれる場合)、 user01@foo.hoge.dyndns.net's password: syntax error in expression "": premature end of expression while executing "if [ expect "Are you sure you want to continue connecting (yes/no)?" ] then " となってしまいます。一方、書き換わって、受け入れるかの問い合わせされた場合も同様の文法エラーとなってしまいました。 if文を入れる場合にはどう記述したらいいのでしょうか?

  • シェルスクリプト中の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 -- 色々と調べてみたのですが理由がわからず、お教えいただければ幸いです。

  • 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\]このようにエスケープしてみても同じエラーが出てしまい、実行できません。 どのようにすれば正規表現として認識してくれるのでしょうか。 以上よろしくお願いいたします。

  • シェルスクリプトのループ内でSSH接続できない

    ファイル内にある行数文、あるサーバに接続し、処理をしたいのですが、 「0-0:ambiguous redirect」とエラーが発生し、正常に動作しません。 リダイレクトが悪いのはわかるのですが、どのようにしたらよいか いろいろやったのですが、うまくいきません。 こちらを参考に対応をしました。 http://okwave.jp/qa/q6974977.html ソースは以下の通りです。 while read F1 F2 F3 F4 F5 do expect -c " set timeout 10 spawn ssh ${id}@${host} expect \"Are you sure you want to continue connecting (yes/no)?\" { send \"yes\n\" expect \"${id}@${host}'s password:\" send \"${pass}\n\" } \"${id}@${host}'s password:\" { send \"${pass}\n\" } expect \"\[${id}@${host} ~\]$\" send \"ls\n\" interact " 0<&9- done 9<&0-0<$OUT_FILE ご教授下さい。

このQ&Aのポイント
  • Accessで障害履歴を管理するDBを作成し、フォーム上で障害内容を起票して障害履歴テーブルに保存します。
  • 毎月、指定した月の障害をクエリで抽出し、csvにエクスポートするために、フォーム上でボタンを作成します。
  • エクスポートする際には、フォーム内で指定した年月を読み取り、自動的にファイル名を生成してcsv出力します。
回答を見る