AKB48の推しメンをセンターにできちゃうかもしれない!? >>

expectを用いてPWの自動入力方法は知っているのですが
今度使用するサーバーにexpectコマンドがインストールされていません。
su -u user -c command
をシェル内で使用したいのですが、もちろんuserは他ユーザなのでPW入力を求められます。
何か逃げてとなるexpectコマンド以外で良い方法ありませんか?

このQ&Aに関連する最新のQ&A

A 回答 (5件)

私のシステム開発及びサーバ構築する経験上、サーバ管理者に設定方法より目的を提示されたほうがより良い答えが見つかるかもしれません。



No.3さんがセキュリティ及びサーバを本当に理解されて記載されているのか不明です。

技術的なセキュリティ対策はサーバ管理者にお任せすればいいと思います。
    • good
    • 1

sshは、ソースのコンパイル又はバイナリをインストールです。

expectのインストール及びNo1さんの方法を含め検討した方がいいかもしれませんね。
    • good
    • 0
この回答へのお礼

有難うございます。
SSH等のインストールに関してはサーバー管理者と相談してみます。

お礼日時:2006/06/13 10:28

expect の場合はどこかにパスワードの平文が書かれていることが前提となるでしょうから、suid よりもさらに危険です。

suid であれば、そのプログラムにセキュリティホールがない限り、そのプログラムおよびサブ・プログラム以外のプログラムが user 権限で実行されることはありません。

SSH や SSL についても、キー・ファイルを su を実行するユーザが持っていることが前提ですので、セキュリティ的には expect と何ら変わりはありません。そもそも、SSH や SSL はリモート接続するために使用するものですので、ローカル接続ではあまり意味を成しません。

ちなみに、Linux には sudo というコマンドがありますので、このソースコードを改変して AIX に移植するとそれなりのセキュリティを維持できるかもしれません。(コンパイラなどの開発環境と高度なプログラミング技術が必要になるでしょうけど)

> ssh大変興味深いですね、ただ私の使用しているOSが
> AIXなのでsshがありません。Linuxのみですか?

オープンソースなので、開発環境があれば自分の環境でコンパイルして利用できると思います。(AIX に対応しているかどうかまでは分かりません)
    • good
    • 0
この回答へのお礼

有難うございます。確かにExpectを使用する際にShell内にパスを書くのでセキュリティ上問題がありますね、ファイルのパーミッションを操作するくらいしか保護できませんし・・
suid、検討してみます。

お礼日時:2006/06/13 10:27

似たような事例を少し複雑になりましたがsshでおこないました。


しかし、時間の経過と共に設定内容を忘れていくので・・・
expectを利用(install)したシンプルな設定方法がお勧めです。

参考URL:http://www.atmarkit.co.jp/flinux/rensai/linuxtip …

この回答への補足

回答有難うございます。
ssh大変興味深いですね、ただ私の使用しているOSがAIXなのでsshがありません。Linuxのみですか?
この件とは別にsshに関しては調べてみようと思います。

補足日時:2006/06/12 15:04
    • good
    • 2

結論から言えばコマンドで逃げ手となる手段はないと思います。

セキュリティを犠牲にしてもよいのであれば、suid を使えば良いかともいます。

chmod u+s command
chown (exec-user) command

これで実行すれば、そのコマンドは exec-user 権限で実行されるでしょう。
    • good
    • 0
この回答へのお礼

お礼が凄く遅くなって申し訳ございません、回答有難うございます。
セキュリティは犠牲にできませんのでコマンド自体のパーミッションは変更できないんです。そこでexpectをっと考えていました。

お礼日時:2006/06/12 15:04

このQ&Aに関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qシェルスクリプトでパスワードを入力する方法について

いつもお世話になっております。
シェルスクリプトでパスワードの入力が必要なコマンドを自動化したい場合にどの様に書けばよいのでしょう?
単純にコマンドの次の行にパスワード入れても実行されそうも無いので、何か別のコマンドで出来るのでしょうか?

Aベストアンサー

リダイレクトで出来る場合も有りますよ。

xxコマンド <EOF
xxxパスワード
EOF

EOFと言う文字が出るまで文字を送るって奴ですね。
リダイレクトでダイレクトに送るとコマンドの起動パラメータになってしまうので
間接的に送ってあげる訳です。上記の場合、改行も含んでいます。

ApacheのSSL起動の時のパスワード入力に使っていた事があります。

Qシェルスクリプトの書き方

すみません、シェル初心者なのですが、急を用してまして質問させて頂きました。

シェルスクリプトで
コマンドを実行する前に他のユーザにスイッチしてから
実行するというのを実現したいのですが・・・

#!/bin/csh

コマンド1
コマンド2
・・・

とコマンド1の前に
su コマンドを実行させたいのですが、
パスワードを入力する際、対話式なので
どう書いてよいか分かりません。

よろしくお願いします。

Aベストアンサー

No2です。

私も遅くなりました。
状況として許されるならば,最初にroot権でスクリプトを実行し,root権が必要ないスクリプト(コマンド)は
一般ユーザに切り替えて実行すれば良いと思います。

スクリプトが二つあったとしてroot権で実行するのがA.sh
一般ユーザ権で実行するのがB.shとすると

まずA.shをroot権で実行します。
で,一般ユーザ権で実行させたい部分(B.sh)をA.shの中で
実行すればよいのですが下記方法で実行して下さい。
--
su - $一般ユーザアカウント -c './B.sh'
--

rootから一般ユーザになる分にはパスワードの入力がいらないのでパスワードを渡さず,rootと一般ユーザの権限切替ができると思います。

--部分解説--
su - $一般ユーザアカウント -c './B.sh'

su - $一般ユーザアカウント
⇒なりたいアカウントの環境を引き継いでユーザ変更を実施する。
su -c './B.sh'
⇒-cの後に続くコマンドをユーザ変更をして実行する。但し,一回限り。


以上で説明になってますか?

No2です。

私も遅くなりました。
状況として許されるならば,最初にroot権でスクリプトを実行し,root権が必要ないスクリプト(コマンド)は
一般ユーザに切り替えて実行すれば良いと思います。

スクリプトが二つあったとしてroot権で実行するのがA.sh
一般ユーザ権で実行するのがB.shとすると

まずA.shをroot権で実行します。
で,一般ユーザ権で実行させたい部分(B.sh)をA.shの中で
実行すればよいのですが下記方法で実行して下さい。
--
su - $一般ユーザアカウント -c './B.sh'
--

rootか...続きを読む

Q自動起動シェルで「su - user -c "command"」が実行できない

初めて質問いたします。
よろしくお願いします。

OS:solaris8

OSの起動・停止時に自動起動させたいコマンドがあったので、
以下のシェル(testsh)を作成し、/etc/init.dに置き、
/etc/rc0.dにtestshに対しK99testshの名称でシンボリックリンクを作成、
/etc/rc3.dにtestshに対しS99testshの名称でシンボリックリンクを作成しました。

OS起動時には、iii.txtが削除され、
OS停止時には、jjj.txtが削除されると思うのですが、
削除されていませんでした。

OSの起動・停止時ではなく、sh -x testshで起動した場合は、
正常に動作しました。

又、suでユーザーを変更しないスクリプトに変えた場合は、OSの起動・停止時にiii.txt、及びjjj.txtが削除されていたので、
起動・停止時のsuが正常に動作していないように思います。

どなたが原因などお分かりでしょうか?
又は、手順で何か間違いなどありますでしょうか?
ご教授よろしくお願いします。


以下シェル(testsh)の内容
#!/bin/sh

case "$1" in
start)
su - user -c "rm /export/home/user/test/iii.txt"
;;
stop)
su - user -c "rm /export/home/user/test/jjj.txt"
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac

exit 0

初めて質問いたします。
よろしくお願いします。

OS:solaris8

OSの起動・停止時に自動起動させたいコマンドがあったので、
以下のシェル(testsh)を作成し、/etc/init.dに置き、
/etc/rc0.dにtestshに対しK99testshの名称でシンボリックリンクを作成、
/etc/rc3.dにtestshに対しS99testshの名称でシンボリックリンクを作成しました。

OS起動時には、iii.txtが削除され、
OS停止時には、jjj.txtが削除されると思うのですが、
削除されていませんでした。

OSの起動・停止時ではなく、sh -x test...続きを読む

Aベストアンサー

Solaris8の環境設定の問題の可能性が高そうですね。

現在、「su - user」で実行していますが、これだとユーザ別の環境初期化が動きますよね。
.loginや、.profile等の中で、OpenWindowを前提としたモジュール等が起動されているのではないでしょうか。
GUIログインで動いている環境(RunLevel5)ならば、その可能性は高いかと思います。

ためしに、「su user」でやってみたらどうですかね。

これが次の切り分けだと思います。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

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

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 ...続きを読む

Aベストアンサー

おはようございます。
これはおそらく先の質問
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を参照されたのだと思いますが、
私もそのままではうまくいきませんでした。
そのURLの例は間違っているのだと思います。
(動かした後でコメントをいれて、動作確認をしなかったのかな?)
ちなみにコメントを入れる場合は下のように、行末に;
をつけてから入れるとよいようです。

基本的にエラーの原因は#2さんのご指摘のとおりです。
参考URLも良く見ると最後に"がありますよ。(それでも動か...続きを読む

Qgrepで検索文字列が完全一致した行だけ取り出す方法

grepの文字列検索で検索文字列が単語として、完全一致した行だけ取り出す方法はないでしょうか?

通常は
grep hoge hoge.txt

と打つと、hogeが含まれる行が出力されますが、今回は含まれる行ではなくて完全に文字列が一致した行だけ取り出したいのです。

例えばhoge.txtの中に
cc ghoge
kkl hogem
jjll hoge
という3行があったとしたら最後の行でhogeという文字が空白で区切られた行だけ取り出したいのです。

何かよい方法があれば教えてください

Aベストアンサー

-w オプションじゃだめですか?

参考URL:http://www.linux.or.jp/JM/html/GNU_grep/man1/grep.1.html

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Qシェル 会話形式でエンターキーの動作は?

シェル内で、ENTERキーを押した時の動作をしたいと思います。
具体的には、もともと「telnetする、接続→ある値を入力する→ENTERを押す→入力した値に合わせたテキストが出力される→connection終了」という処理があり、
これを自動化して、出力されたテキストをファイルに保存するためのシェルを作りたいのです。

作ってみたところ、1点だけできないのがENTERキーを押す部分です。
シェルを実行すると、値の入力まで行われた状態で終わってしまいます。
そこで手動でENTERを押せば、正常に処理が終了します。

おそらく、会話形式でENTERを押した時の処理がうまくかけていないと思っています。
echo -e "\r\n"などいろいろ試したのですが・・・
echoではないのではないかと推測していますが、行き詰まりました。

どのようにしたらよいのかご教授ください。

Aベストアンサー

echo "
"

でいいんじゃないでしょうか。ちょっとやりたいことが正確には理解できていないかもしれませんが。
文法的にまちがって見えても、本当に改行してしまうところがミソです。

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

今まで変更した各種設定を一気に行うシェルスクリプトを作成して、サーバーを再セットアップしてもすぐに今までどおり使えるようにしようとしています。
スクリプト中に対話型のコマンドを記述すると、そこで処理が中断して、入力待ち状態になってしまいます。
しかし、入力値は大抵いつも同じですので、これをスクリプト中に記述して、処理が中断する回数を極力減少させたいと考えています。

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回目の入力が求められていますが、これも謎です。

このような対話型のコマンドとその入力値を全部シェルスクリプトに記述するなどして、処理を自動化する方法をご存知の方は、ぜひ教えてください。

今まで変更した各種設定を一気に行うシェルスクリプトを作成して、サーバーを再セットアップしてもすぐに今までどおり使えるようにしようとしています。
スクリプト中に対話型のコマンドを記述すると、そこで処理が中断して、入力待ち状態になってしまいます。
しかし、入力値は大抵いつも同じですので、これをスクリプト中に記述して、処理が中断する回数を極力減少させたいと考えています。

passwdコマンドをechoコマンドと組み合わせて次のようにやってみました。
# echo "xxx
xxx" | passwd user

し...続きを読む

Aベストアンサー

>サーバーを再セットアップすると毎回異なるssh_host_keyを生成するため、このSSHサーバーのクライアントとなりうるホストのknown-hostsを更新する処理が必要になり、これを初期設定スクリプト中で行いたいと考えています。

ssh_host_keyが毎回変わってしまうということであれば、今あるssh_host_keyをスクリプト中においてて、変わったssh_host_keyと入れ替えてしまえばいいんじゃないんでしょうか。
そうすれば、相手側のホストにファイルを追加したりしなくてすみます。

個人的にはそこまでして自動化する必要があるかどうか疑問ですが。
実際そのスクリプト自体は手動でキックするのでしょうし。

結局のところ、セットアップした状態を、GhostとかTrueImageといったイメージングソフトでバックアップしておいて、そこからリカバリするほうが一番簡単な話のような気がします。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング