- PR -

rshを実行時のpemission deniedについて

投稿者投稿内容
marun
常連さん
会議室デビュー日: 2007/07/19
投稿数: 22
投稿日時: 2009-03-23 18:15
scanf使ってますか?
fflush(stdin);をscanfの前に入れるか、
gets+scanfではなくfgets+sscanfに変えるのをご検討ください。

C言語のマニュアルや、ネットでscanfについての注意事項を調べ
合致するかどうかご確認ください。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2009-03-23 19:45
手元のLinuxで「man rsh」とすると
引用:

You cannot run an interactive command (like rogue(6) or vi(1)); use rlogin(1).


と書いてあります。Solarisでも何かしら注意書きがないでしょうか。
Hiro
会議室デビュー日: 2007/06/08
投稿数: 13
投稿日時: 2009-03-25 11:37
marunさん、スフレさん
返信ありがとうございます。

 >scanf使ってますか?
 >fflush(stdin);をscanfの前に入れるか、
 >gets+scanfではなくfgets+sscanfに変えるのをご検討ください。

ですが、scanfは使用せずに、getsで入力待ち状態にしています。
getsやscanfを実施しないコード(printfのみ)で
>rsh -l aaaa remotename toollist
と実行してみると
**************************
* tool list *
**************************
1.abc
2.def
3.ghi
99.end
select number > > _
と表示されましたので、入力待ちの方法を
ご指摘のあったfgets等で一度実施してみたいと思います。



 >手元のLinuxで「man rsh」とすると
 >引用: --------------------------------------------------------------------
 >You cannot run an interactive command (like rogue(6) or vi(1)); use rlogin(1).
 >--------------------------------------------------------------------------
 >と書いてあります。Solarisでも何かしら注意書きがないでしょうか。

Solarisで「man rsh」を見てみると
たしかに、「viのような対話型コマンドは実行できません。対話型コマンドは
rloginを使用してください。」との記述がありました。
>rsh -l aaaa remotename vi toollist.c
を実行してみると、確かに正常動作はしませんでした。

ありがとうございました。

しかし、rloginですと、ログインしたあと、実行コマンドを
入力しないといけなく、最終目標である
リモートログインのコマンドを入力しただけで
画面表示されるということにはならなくて。
また、いろいろと検索してみます。

対話型のリモートログインの方法をご存知であれば、
よろしくお願いします。

[ メッセージ編集済み 編集者: Hiro 編集日時 2009-03-25 11:50 ]
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2009-03-25 12:53
こんにちは。
既に指摘されていますが、あくまで対話型にこだわるなら、rlogin にするか、もしくは ssh を使うべきかと思います。

対話型の動作が必須ではなく、あくまで「実行時に条件を指定する仕組み」が欲しいということであれば、件のプログラムを、標準入力の内容により挙動を変えるのではなく、コマンドラインオプションによって変えるようにした方が良いと思います。
つまり、
 $ command
 〜選択肢出力〜
 1  ← 選択肢入力
ではなく、
 $ command 1
のような造りにしてしまう、ということです。getsで得た入力ではなく、main 関数の引数 ( argc, argv ) を用いることになるでしょう。

最後に。gets はバッファ超過を防ぐ仕組みがないので、使うべきではないです。たとえ内輪での使用に限るにしても。
代替としては、既に紹介されている fgets があります。
※Cの標準関数の中には、使うべきではないものが結構あります。scanf ( 代わりに fgets + sscanf ) や、一部のstr系 ( strcpy の代わりに strncpy 等 ) や sprintf ( 代わりに snprintf ) などなど。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2009-03-25 12:55
「ssh -t」で可能だと思います。
セキュリティの貧弱さが理由で、rsh/rlogin は最近はあまり使われません。

Hiro
会議室デビュー日: 2007/06/08
投稿数: 13
投稿日時: 2009-03-31 13:41
angelさん、スフレさん
返答ありがとうございました。

所有しているSolarisマシンにはsshが
インストールされてませんでしたので、
OpenSSH等をインストールして、挑戦してみたいと思います。

 >最後に。gets はバッファ超過を防ぐ仕組みがないので、使うべきではないです。たとえ内輪での使用に限るにしても。
 >代替としては、既に紹介されている fgets があります。
 >※Cの標準関数の中には、使うべきではないものが結構あります。scanf ( 代わりに  >fgets + sscanf ) や、一部のstr系 ( strcpy の代わりに strncpy 等 ) や sprintf ( 代わりに snprintf ) などなど。

このことは、初めて知りました。
参考書(初めてのC言語等)は、普通に使われていたので、
迷うことなく使用してました。
今後は、angelさんのご指摘のあった点に気をつけて
プログラムの作成をしていきたいと思います。

ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)