プロが教えるわが家の防犯対策術!

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 コマンドを実行」
が問題みたいなのですが何がまずかったのでしょうか?

A 回答 (4件)

おはようございます。


これはおそらく先の質問
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1115230
の参考URLを参照されたのだと思いますが、
私もそのままではうまくいきませんでした。
そのURLの例は間違っているのだと思います。
(動かした後でコメントをいれて、動作確認をしなかったのかな?)
ちなみにコメントを入れる場合は下のように、行末に;
をつけてから入れるとよいようです。

基本的にエラーの原因は#2さんのご指摘のとおりです。
参考URLも良く見ると最後に"がありますよ。(それでも動かないと思いますが。。。)
ただし、今の場合、最後に
interact
を入れないとうまく動かないとおもいます。(少なくとも私はそうでした。)
この掲示板の過去の質問が参考になりました。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=924035
http://oshiete1.goo.ne.jp/kotaeru.php3?q=925167

#!/bin/sh
HOST=192.168.1.105
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.lzh $UNAME@$HOST:/home/fat32/ ;こめんと
expect \"password:\" ;こめんと
send \"$PASSWD\r\" ;こめんと
interact
"

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=924035
http://oshiete1.goo.ne.jp/kotaeru.php3?q=925167

この回答への補足

皆様、ご回答有難うございます。お手数お掛けしております。

> http://oshiete1.goo.ne.jp/kotaeru.php3?q=1115230
> の参考URLを参照されたのだと思いますが、
はい、さようです。

> ただし、今の場合、最後に
> interact
> を入れないとうまく動かないとおもいます。(少なくとも私はそうでした。)
> この掲示板の過去の質問が参考になりました。
> http://oshiete1.goo.ne.jp/kotaeru.php3?q=924035
> http://oshiete1.goo.ne.jp/kotaeru.php3?q=925167
有難うございます。参考になります。

> #!/bin/sh
> HOST=192.168.1.105
> 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.lzh $UNAME@$HOST:/home/fat32/ ;こめんと
> expect \"password:\" ;こめんと
> send \"$PASSWD\r\" ;こめんと
> interact
> "
/home/fat32/ # expect コマンドの管理下でscpを実行する
コマンドの管理下でscpを実行する: Not a directory
invalid command name "こめんと"
while executing
"こめんと"

となりました。序でに

expect \"password:\" #こめんと
send \"$PASSWD\r\" #こめんと
interact
"

としてみましたら、

/home/fat32/ # expect コマンドの管理下でscpを実行する
コマンドの管理下でscpを実行する: Not a directory
usage: send [args] string
while executing
"send "xxxxxxxx\r" #こめんと"

となってしまいました。
何か勘違いしてますでしょうか?

補足日時:2004/12/07 13:16
    • good
    • 0
この回答へのお礼

どうもお陰さまで解決しました。
有難うございました。

お礼日時:2004/12/08 01:26

>expect \"password:\" #こめんと



ごめんなさい。
expect \"password:\" ;こめんと
の「こめんと」は#込みのつもりでした。
書きこんだあとに気づいたのですが、
やっぱり誤解がありましたね。

expect \"password:\" ;#こめんと
としてください。
しかし、コメントなんてイランでしょうから、けずっていいとおもいますよ。

この回答への補足

お手数お掛けしましてスイマセン。

> expect \"password:\" ;#こめんと
> としてください。
> しかし、コメントなんてイランでしょうから、けずっていいとおもいますよ。
expect -c " # expect コマンドを実行
set timeout 20
spawn scp -P 60001 $TARGET.lzh $UNAME@$HOST:/home/fat32/ ;# expect コマンドの管理下でscpを実行する
expect \"password:\" ;#こめんと
send \"$PASSWD\r\" ;#こめんと
interact
"
として、上手くいきました。感動です。 \(^o^)/
これでリモートホストに自動バックアップできます。

どうも有り難うございました。m(_ _)m

補足日時:2004/12/07 14:51
    • good
    • 0
この回答へのお礼

どうもお陰さまで解決しました。
有難うございました。

お礼日時:2004/12/08 01:25

おそらく、expect -c " のダブルクォーテーションが閉じられていないからではないでしょうか?


こんな感じで試してみて下さい。

#!/bin/sh
HOST=192.168.1.105
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.lzh $UNAME@$HOST:/home/fat32/
expect \"password:\"
send \"$PASSWD\r\"
"
↑これ

この回答への補足

> send \"$PASSWD\r\"
> "
> ↑これ
閉じ「"」が必要だったのですね。

/home/fat32/ # expect コマンドの管理下でscpを実行する
コマンドの管理下でscpを実行する: Not a directory
usage: send [args] string
while executing
"send "user01\r" # login: が出たらログイン名を打ち込む"

となりました。ログイン名は不要でしたね。

補足日時:2004/12/07 13:15
    • good
    • 0
この回答へのお礼

どうもお陰さまで解決しました。
有難うございました。

お礼日時:2004/12/08 01:25

こんばんは。


エラーメッセージによると、文が閉じられてない!って怒られてますよね。

「expect -c " # expect コマンドを実行」

この「"」ダブルコーテーションって必要なんでしょうか?
必要だとしてもひとつしかない(=カッコとして成り立ってない)し¥マークもついてないのが気になりました。

※いま手元に環境がないんで私のほうでは試せません。
 すいません。

この回答への補足

ありがとうございます。

「"」の直前に「\」を入れたら
missing "
while executing
"""
spawn: not found
couldn't read file "login: ": no such file or directory
send: not found
couldn't read file "sword: ": no such file or directory
send: not found

となりました。

「"」を取っ払ったら

expect: option requires an argument -- c
usage: expect [-div] [-c cmds] [[-f] cmdfile] [args]
spawn: not found
couldn't read file "login: ": no such file or directory
send: not found
couldn't read file "sword: ": no such file or directory
send: not found

となりました。

「/usr/bin/expect -c "" # expect コマンドを実行」
としたら

spawn: not found
couldn't read file "login: ": no such file or directory
send: not found
couldn't read file "sword: ": no such file or directory
send: not found

となりました。でもspawnの行で引っかかってしまいます。
うーん、難しいんですね。

補足日時:2004/12/07 01:16
    • good
    • 0
この回答へのお礼

どうもお陰さまで解決しました。
有難うございました。

お礼日時:2004/12/08 01:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています