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

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

#!/bin/csh

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

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

よろしくお願いします。

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

A 回答 (3件)

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の後に続くコマンドをユーザ変更をして実行する。但し,一回限り。


以上で説明になってますか?
    • good
    • 1
この回答へのお礼

回答ありがとうございます!
教えて頂いたとおりにやったらできました!
勉強になりました。
ありがとうございます。

お礼日時:2005/04/13 13:20

方法が幾つかあるのですが,もう少し情報を下さい。



1.シェル実行の際にパスワードを入力する必要があるか?
(パスワードを引数として入れるかどうか)
#セキュリティ上芳しくない

2.別途回答がありましたが,sudoコマンドが使える環境であるか?

3.実行したいシェルスクリプトは一般ユーザ権限かroot権限か?

以上教えて頂ければと思います。

この回答への補足

すみません、質問にお答えするのが遅くなりました。

1.シェル実行時にはパラメータは渡しますが、パスワードは渡しません。

2.sudoはスクリプトを実行したい環境では使われていないようなので、できれば避けたいといった感じです。

3.実行したいスクリプトは一般ユーザなのですが、
途中、root権限で実行させたいスクリプトがあります。

こんな回答で解りますでしょうか?

補足日時:2005/04/11 11:06
    • good
    • 0

OSが何かわからないので完全な回答はできませんが、


「sudo」というコマンドを調べてみてください。

# man sudo

一般的な説明は↓こちらにも。

参考URL:http://www.atmarkit.co.jp/fsecurity/rensai/unix_ …
    • good
    • 0
この回答へのお礼

お礼が遅くなりました。
回答どうもありがとうございました。

お礼日時:2005/04/13 13:21

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

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

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

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

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

QUNIXシェルの途中でユーザー切り替え

UNIXシェルの途中でユーザーを切り替える方法はありますか。

例)
 ・ユーザAで先頭100行を実行し、残りはユーザBで実行など・・・。

 ※suできれば良いのですが、対話形式のパスワード入力を促されてしまいますよね・・・。

Aベストアンサー

#3です。
>これを一つのシェルにして、都度ログインしている部分、及び、コマンド実行部分を自動化したい・・・、と言うのが趣旨です。
>それで、まとめたシェルについては、rootで実行ではなくて、一般ユーザで行ないたい・・・。
>という流れとなります。ニュアンスは伝わりましたでしょうか。

伝わってますよ。その前提での回答です。回答を良くお読みください。cmdaとcmdbを並べた親コマンドを作ってそれを一般ユーザーで実行します。
ただし、都度ログインということはログイン時の環境変数設定とかも影響するかもしれないので、必要に応じて、cmda, cmdb の先頭で、source ~usera/.profile などを実行する必要があります。

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」でやってみたらどうですかね。

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

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

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

Aベストアンサー

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

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

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

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

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

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

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

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

Aベストアンサー

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

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

Qroot権限の実行コマンドを通常ユーザーで実行

root権限に限らないのですが、他のユーザーの権限でしか実行できないコマンドを自分で実行する方法が知りたいのです。
と言っても、rootや他ユーザーのパスワードを知っているという前提です。

例えば、通常ユーザーで作業をしているときに、root権限で行う必要のあるコマンドを実行したいとします。
今は、suでログインしてから実行していますが、shellスクリプトで実行したいと思っています。

どういったshellスクリプトになりますでしょうか?

Aベストアンサー

> 今回やろうと思ってるのは、suでログインしてから、いくつかの操作を行いたいので

であれば、そのいくつかの操作をまとめてシェルスクリプトにして、
それを su の -c に渡せば良いですね。

例えば、rally というユーザで、シェルスクリプト名が do_rally.sh とします。
スクリプトに実行権限がついていなければ

% su - rally -c "sh do_rally.sh"

という感じ。実行権限がついていれば

% su - rally -c do_rally.sh

で良いです。

ただ、最低一回はパスワードの入力があるので、su を使っている限りは
それからは逃れられません。

# ちょっと遅くなったので、もう sudo を使っているかな?

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権限の違うシェルスクリプトの実行

3つのシェルスクリプトがあります。

●root権限で実行  aaa.csh
●ユーザ指定権限で実行 bbb.csh
●root権限で実行 ccc.csh

この3つのシェルスクリプトはaaa.csh →bbb.csh →ccc.cshの順番でバッチ処理として
cronに設定したいのですが、
権限が違うのでroot権限のcrontabとユーザ指定のcrontabに
それぞれ設定しなくてはいけません。

あまりスマートではないかと思い、
何かよい方法はないかと質問させて頂きました。
3つのシェルスクリプト1つシェルスクリプトにまとめてroot権限のcrontabに設定してしまう方法とかどうでしょうか?
ちなみにスクリプトの処理の内容は単純なファイルコピーなどです。

意味分かりますでしょうか?
よろしくお願いします。

Aベストアンサー

root権限からのsuであれば、恐らくパスワードは聞かれずにすむと思います。
suの部分を以下のように書いてみてください。

su - username -c ".../bbb.csh"
※usernameと.../は適宜置き換えてください。

Qbashなどのシェル変数の値に改行を含める事は可能でしょうか?

タイトルの通りですが、通常のシェル変数の値として

 [prompt]$ aaa="bbb<改行>ccc"

のようなセットを行い、

 [prompt]$ echo $aaa
 bbb
 ccc
 [prompt]$

のような結果を得たいのですが、可能でしょうか。

Aベストアンサー

可能です.
というか,やってみたら出来ることがわかると思います.こんなところで聞くより早い.
なお,sh/bash系では改行文字は特にエスケープせずそのまま入れられます.

aaa='bbb
ccc'

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)


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

人気Q&Aランキング

おすすめ情報