• ベストアンサー
  • すぐに回答を!

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

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

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

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

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

expect Enter\ expect Retype\ ではなく expect .*password: 行末の \ が改行をエスケープして次の行と繋がってしまい、 expect Entersend $password になってしまっているのでは? バッチでパスワード更新するなら、chpasswdコマンドがあればそれを使うと楽です。

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

質問者からのお礼

ありがとうございます。 expectの構文をしっかり理解していきたいと思います。 ですが、構文がもっと直だったらいいと思いましたが そう思うのは、私がまだ習熟していないからかもしれません。 一生懸命頑張ります。

関連するQ&A

  • シングルユーザーモード

    さきほど質問したものですが、 GUN grubの画面でシングルユーザーモードでコンソール画面に入り sudo passwd rootでパスワードを変更しようとしたところ、 Authentication token manipulation error password unchangedとエラーが出てきてしまい どうしてもパスワードの設定ができません ご教示お願いします。

  • Linux メールアカウント自動生成

    現在、PHPでログイン機能のあるWEBサイトを開発しております。 そこでアカウントを作成したタイミングでバーチャルドメインのメールアドレス(info@www2.example.jp) を自動生成するプログラムを作りたいと思っております。 シェルスクリプトは初心者です。 OS: CentOS release 5.7 (Final) メールサーバ: qmail root権限有り 今のところ考えている方法↓ 1、メールアカウントを作るシェルスクリプトを作成 #!/bin/sh # domain domain=$1 # user name user=$2 # password passwd=$3 # mail address email=$2@$1 expect -c " set timeout 5 spawn /home/vpopmail/bin/vadddomain ${domain} expect \"Please enter password for postmaster:\" send \"${passwd}\n\" expect \"enter password again:\" send \"${passwd}\n\" interact " expect -c " spawn /home/vpopmail/bin/vadduser ${email} expect \"Please enter password for ${email}:\" send \"${passwd}\n\" expect \"enter password again:\" send \"${passwd}\n\" interact " 2、PHPのシステム関数でシェルスクリプトを実行 $result = exec("/home/example/create_email.sh www2.example.jp info passwd"); 【問 題】 ・root権限でないとシェルスクリプトを実行できない ・会員数が1千人規模になった場合の負荷 (会員は恐らく最大1千人くらいまでを見越しています。また、 全員にメールアドレスを作成しますが、必ずしも使用しない。) 問題の解決方法はありませんでしょうか?また、 もっといい方法はありませんでしょうか?。

  • 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 --------------- よろしくお願い致します。

  • 自動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で複数台にログインし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

  • シェルスクリプトを使った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です。 一体何が原因なのでしょうか・・

  • 対話型のコマンドで入力する値をスクリプトに盛り込んで自動化したい

    今まで変更した各種設定を一気に行うシェルスクリプトを作成して、サーバーを再セットアップしてもすぐに今までどおり使えるようにしようとしています。 スクリプト中に対話型のコマンドを記述すると、そこで処理が中断して、入力待ち状態になってしまいます。 しかし、入力値は大抵いつも同じですので、これをスクリプト中に記述して、処理が中断する回数を極力減少させたいと考えています。 passwdコマンドをechoコマンドと組み合わせて次のようにやってみました。 # echo "xxx xxx" | passwd user しかし次のように失敗してしまいました。 Changing password for user user. New password: Retype new password: New password: New password: passwd: Conversation error エラーメッセージより再入力がうまくできていないようです。 さらに3回目の入力が求められていますが、これも謎です。 このような対話型のコマンドとその入力値を全部シェルスクリプトに記述するなどして、処理を自動化する方法をご存知の方は、ぜひ教えてください。

  • 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を書かないで、コピー 出来るようになりますか??

  • 自動パスワード入力で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 コマンドを実行」 が問題みたいなのですが何がまずかったのでしょうか?

  • パスワードの変更

    RedHat7.2Jを利用しております。 あるユーザ(rootではありません)のパスワードをpasswdコマンドで変更しようとしたのですが、新パスワードを入力すると it is based on a dictionary word と出てきてしまい受け付けてくれません。 何度かトライすると最後は passwd:Authentication toke manipulation error となって終了してしまいます。 新パスワードはある固有名詞なので一般的な名詞ではないですし、以前使っていたものでもないはずなのですが、いずれにせよ強制的に新パスワードを受け付けさせる方法は無いものでしょうか?