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

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

ただいまの
回答率

90.34%

  • SSH

    740questions

    SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

.sh リモートでパスワード入力を省略してファイルの存在確認

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 5,161

2台のlinuxサーバ間で、リモートでファイルの存在確認をするシェルスクリプトを考えています。
サーバAが日次処理でバックアップを作成、サーバBがリモートでサーバAのバックアップ
を確認し結果をメール送信する、といった一連の処理です。

単純に

!/bin/sh

if ssh [IPアドレス] test -e [ファイルパス]
then
echo "found"
fi
とすると取得はできるのですが、いちいちパスワードを入力しなければなりません。

バッチ処理で確認したいので、パスワードは自動入力にしたいので、expectを使って
パスワードを送信するところまではできました。
expect -c "
set timeout 30
spawn ssh [ユーザ名]@[IPアドレス]
expect ":"
send \"[パスワード]\n\"
"

が、この先、存在確認を実行しようとしても上手くいきません。
一応、以下のように考えてみたのですが....

!/bin/sh

cat << EOF > "cmd.txt"
if [ -e [ファイルパス] ]
then
echo "found"
fi
EOF
cmd=cat "cmd.txt"
rm "cmd.txt"

expect -c "
set timeout 30
spawn ssh [ユーザ名]@[IPアドレス]
expect ":"
send \"[パスワード]\n\"
send \"${cmd}\n\"
"

"extra characters after close-quote while executing"
とメッセージが表示されます。

パスワードを自動入力した後、存在確認を行う方法をご教授いただけないでしょうか。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+5

まず、SSHのパスワードをシェルスクリプトに書いてしまう、というのは確実によくないです。このオペレーション用に公開鍵/秘密鍵のペアを作って、それを使うようにしましょう。

authorized_keysの書き方次第で、接続したら特定のコマンドを実行して接続断という設定にできますので、他のことをされる心配も、自動化のための余計な苦労も、ぐっと少なくなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

私のやり方とは異なるのでエラーが有るかも

#!/bin/sh

cmd=$(cat <<'EOF' >cmd.txt
if \[ -e [ファイルパス] ]
then
echo found
fi
EOF
)

expect -c "
set timeout 30
spawn ssh [ユーザ名]@[IPアドレス]
expect ":"
send \"[パスワード]\n\"
send \"${cmd}\n\"
"

ご参考に自分環境でのシェルスクリプト

#!/bin/bash
user=hoge
pswd=hoge
cmd=$(cat <<'EOF'
if \[ -e /tmp/aaa ]
then
echo found;
fi
EOF
)

expect -c"
set timeout 10
spawn ssh ${user}@172.0.0.1
expect {
    \"(yes/no)\" {
    send \"yes\n\"
    }
}
expect {
    \"password:\" {
    send \"${pswd}\n\"
    }
}
expect {
    \"[hoge]\" {
    send \"${cmd}\n\"
    }
}
expect {
    \"\n\" {
    send \"exit\n\"
    exit 0
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんな感じで。

expect -c "
spawn ssh USER@HOST
expect \":\"
send \"PASSWORD\n\"
expect \"\\\$ \"
set timeout 1
send \"test -e FILE_PATH || echo N''G\n\"
expect \"NG\" {
  exit 1
}
send \"logout\n\"
"
if [ $? = 0 ]
then echo ファイルがあった
else echo ファイルがなかった
fi

なお、

cmd=`cat "cmd.txt"`


は、cmdの内容がif [ -e [ファイルパス] ] then echo "found" fiとなり、thenfiの前にセミコロンがないため、入力した先でシンタックスエラーになります。 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • SSH

    740questions

    SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。