php を使用して root 権限でシェル スクリプトを実行するには、次の手順を実行する必要があります。

WBOY
リリース: 2016-07-09 09:10:00
オリジナル
1573 人が閲覧しました

ここ数日間私が取り組んできたことには、シェル スクリプトを使用した PHP と Linux 間の対話が含まれており、PHP を使用して Linux にアクセスするためのスクリプトを実行することは Apach として実行されるため、それ自体ではほとんど機能しないことがわかっています。十分な権限がありません。これには、php の実行時に root 権限を付与する必要があります。

次に紹介する方法は、私も実際にやったことがあり、実装できますが、欠点もありますので、ここで共有します。良いヒントが得られることを願っています。

これは C を使用してアクセス許可の交換を実現します。次のプログラムが正常に実行できる理由を完全に理解したい場合は、SUID と SGID の役割を十分に理解してください。

[プレーン] plaincopy を表示
  1. #含む
  2. #インクルード
  3. #インクルード
  4. #インクルード
  5. int main()
  6. {
  7. uid_t uid、euid ;
  8. uid = getuid(); euid= geteuid();
  9. //printf("私の uid:%un",getuid()); //printf("私のeuid:%un",geteuid());
  10. if(setreuid(euid,uid))
  11. perror("setreuid"); //printf("setreuid uid:%un 後",getuid());
  12. //printf("setreuid euid:%un 後",geteuid()); システム("/home/houqingdong/myshell/mkdir.sh /home/hou_test");
  13. 0 を返す
  14. }
  15. 主な機能の説明:

    1. getuid() に必要なヘッダー ファイルは次のとおりです:
    #include
    #include
    関数プロトタイプ: uid_t getuid(void);
    関数の説明: uid_t は sys/types.h で定義されており、実際には unsigned Int です。型の場合、関数は呼び出し元プログラムの true 値を返します

    実際のユーザーID。
    2. geteuid()
    関数のプロトタイプ: uid_t geteuid(void);
    関数の説明: geteuid() は、現在のプロセスの有効なユーザー ID を取得するために使用されます。プロセスの実行を決定するために有効なユーザー ID が使用されます

    アクセス許可。この値を変更することで、プロセスは追加のアクセス許可を取得できます。実行可能ファイルの setID ビットが設定されている場合、ファイルが実行されると、

    そのプロセスの euid 値は、ファイルの所有者の uid に設定されます。たとえば、ファイル /usr/bin/myshell.sh を実行するための権限は -r-s-

    です。

    -x--x、その s ビットは setID (SUID) ビットで、ユーザーが myshell.sh を実行すると、その有効なユーザー識別コードは

    に設定されます。

    myshell.shの所有者のuid、つまりrootのuid値は0です。

    3. setreuid(); は ID の交換として理解できます

    このファイルをコンパイルします: gcc -o run -Wall run.c 実行可能ファイルを生成します run

    次のステップは、実行するための suid 権限を与えることです: chmod u+s run その機能は、uid を設定することです。通常のユーザーが実行する場合、run.c にある root 権限で実行されます。プロセスの ID は次のようになります。 root の ID が 0 で実行されるように交換され、権限が想像できるようになります。

    しかし、このメソッドの使用には非常に悪い点があります。 run.c で実行したコマンドは次のとおりです。 system("/home/houqingdong/myshell/mkdir.sh /home/ mkdir.sh is me I)スクリプトは自分で書きましたが、最後の 2 つのパラメータはハードコーディングされています。つまり、パラメータを渡すのが非常に不便です。もちろん、パラメータを渡す必要のないプログラムを実行する場合でも、この方法は十分に実行可能です。やりたいこと ユーザーは Linux 上のディレクトリを選択し、その中にファイルまたはディレクトリを作成できます。 このときのパラメータの扱いは非常に困難です。

    この問題に関して別の方法も試しました:

    は、独自のシェル スクリプトを直接記述して実行します: chmod 777 mkdir.sh chmod u+s mkdir.sh

    rootと呼ばれていますアクセス許可を次のように変更してみました: chmod -R 777 /home/ その後、実行後に正常に作成できますが、Apache にアクセス許可を追加するこの方法は、Apache のホーム ディレクトリと仮想ディレクトリにアクセス許可を追加する方法を知っています。

    しかし、これについてはわかりません。単に権限を変更することはできません。

    私の上記の方法には、実現可能性や安全性の点で間違いなく多くの欠点があることは承知しています。そのため、この記事をご覧になり、より良い方法をご存知の方がいらっしゃいましたら、お時間を割いてご協力いただければ幸いです。ヒントをいただけますか、ありがとう! !

    php を使用して root 権限でシェル スクリプトを実行するには、次の手順が必要です: (すべての手順は私自身の実験です。何か間違っている場合は、ご指摘ください。ありがとうございます!)

    1. Apache の実行ユーザーを決定します。

    注: これは、必ずしも誰も httpd を自分でインストールしたわけではありません。私の Apache ユーザーはデーモンです

    2. visudo を使用して Apache 実行ユーザーに root 実行権限を付与します。もちろんパスワードは設定しません。

    注: セキュリティ上の理由から、ここで新しいユーザーを作成し、そのユーザーを Apache の実行ユーザーとして機能させることが最善です

    (httpd.conf ファイルを変更します。後で指摘します) 3. このステップは簡単です。スクリプトを作成し、php の exec、system... 関数を使用して実行します。

    次のステップは、詳細な実装プロセスです:

    1. Apache の実行ユーザーを確認します: lsof -i:80 実行後の結果は次のとおりです:

    この図から、httpd (つまり、Apache) の実行ユーザーが exec_shell であることが明確にわかります (注: これは、私のローカル マシンで変更した後のユーザーです。説明のため、あなたのものは間違いなくこれではありません!)

    lsof は List of file の略で、現在のシステムで開いているファイルを一覧表示するツールです。具体的な使用方法については、http://club.topsage.com/thread-234763-1-1 を参照してください。 html 悪くない

    Linux 上の Apache の実行者を決定したら、安全のため、新しいユーザーを作成し、Apache の実行ユーザーを新しく作成したユーザーに変更します。

    2. Apacheの新しい実行ユーザーを作成します

    useradd your_exec_user ユーザーを作成すると、同じユーザー名を持つユーザー グループがデフォルトで作成されることがわかっています。つまり、your_exec_user のユーザー グループも作成されることになります

    次に、Apache 設定ファイルを変更して、その実行ユーザーが作成したばかりのユーザー your_exec_user:

    に変更されるようにします。

    vi /home/houqingdong/httpd-exe/config/httpd.conf (これは Apache のディレクトリの場所です)

    以下の場所を見つけて、新しいユーザー your_exec_user に変更します

    Apache を再起動します: /home/houqingdong/httpd-exe/bin/apachect1 restart -------------> 再起動後、lsof -i:80 を使用して確認できます。

    3. visudo (または vi /etc/sudoers) を実行し、root 権限を your_exec_user に付与します。また、重要な変更もあります (これが私を悩ませる点です)。

    visudo この場所を見つけて、your_exec_user を追加し、パスワードなしで設定します

    以前、ここまで終わってからphpスクリプトを実行しようとしたのですが、いつも作成に失敗してしまい、さらに、your_exec_userユーザーに切り替えて直接実行したら無事に実行できたのでとても落ち込んでいました。

    その後、Apache ログ ファイルを確認したところ、次のことがわかりました:

    ここで、sudo を実行するときに、sudo を実行するには tty が必要であることがわかります。問題の場所がわかれば、問題は解決できます。 vi /etc/sudoers 次の文をコメント化します。

    これは、デフォルトでは sudo の実行にはターミナルが必要であるため、ここでコメントアウトするだけです。次に、シェルスクリプトとphpコマンドを書きます

    4. これは私が書いた非常に単純なスクリプトです。これは、php 側から渡された $directory と $name を使用して、ディレクトリ内に $name のディレクトリを作成します

    [プレーン]
    plaincopy を表示
      #!/bin/bash
    1. #プログラム
    2. # このプログラムは mkdir: cd $directory を実行します
    3. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    4. エクスポートパス
    5. CD $1
    6. if [ ! -d $2 ];
    7. mkdir $2
    8. その他
    9. エコー「すでに存在します...」
    10. 1番出口
    11. フィ
    12. 機能は非常に簡単で、$directoryと入力して、作成するディレクトリ名が存在するかどうかを確認し、ディレクトリを作成します。
    構築されたphp実行関数:(一部)


    [php]

    plaincopy を表示
    1. if($type=="dir"){
    2. $ make_dir_command ~ exec ( $ make_dir_command
    3. ,
    4. $ Output, $ Return);
    5. _ _ ところで、ここで 1 つ言及しておきます: 構築されたコマンドでは絶対パスを使用するのが最善です 5. Web ページ上の実行結果:
    6. 送信後、実行結果プロンプトがポップアップ表示されるまでに数秒かかります:
    7. /home/ ディレクトリで正常に実行されました: ははは。 。 。これで完了です。 (ブラザー・クン、助けとアドバイスをありがとう!)
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート