タイトルだけを⾒ると
「そんな危険なことするニーズあるの?」と聞こえてきそうですが、
インターネットに公開していないシステムならニーズもあるのではないでしょうか。
ということで、実現する⽅法を紹介したいと思います。
動作環境は
ubuntu22.04にインストールされたnginx
で試しました。
nginxからCGIを呼び出すためにfcgiwrapを使います。
(⼿順1)
fcgiwrapをインストール
#apt install fcgiwrap
(⼿順2)
fcgiwrapの設定を新規作成
#vi /etc/nginx/fcgiwrap.conf
/etc/nginx/fcgiwrap.confに以下を記述
location /cgi-bin/ { gzip off; root /usr/lib; # Fastcgi socket fastcgi_pass unix:/var/run/fcgiwrap.socket; # Fastcgi parameters, include the standard ones include /etc/nginx/fastcgi_params; # Adjust non standard parameters (SCRIPT_FILENAME) fastcgi_param SCRIPT_FILENAME /usr/lib$fastcgi_script_name; }
(⼿順3)
fcgiwrapサービスをrootユーザーで動かすように設定
※rootユーザーで起動しないと、root権限のコマンドが動かせません。ここがミソです。
#vi /lib/systemd/system/fcgiwrap.service
[Service] セクション内の UserとGroupをrootに変更
[Service] Environment=DAEMON_OPTS=-f EnvironmentFile=-/etc/default/fcgiwrap ExecStart=/usr/sbin/fcgiwrap ${DAEMON_OPTS} User=root Group=root
(⼿順4)
systemd に新しい構成を認識させます
#systemctl daemon-reload
(⼿順5)
fcgiwrapを起動します。
※fcgiwrapはnginxとは別のプロセスで動作しています
#systemctl start fcgiwrap
設定は以上です。
後はCGIファイルを作成して、
任意のコマンドを実⾏する記述をして、
WEBブラウザからアクセスすれば
記述されたコマンドが実⾏されます。
(CGIファイルのサンプル)
#mkdir -vp /usr/lib/cgi-bin/ #vi /usr/lib/cgi-bin/test.cgi #chmod 775 /usr/lib/cgi-bin/test.cgi
※CGIファイルには実⾏権限が必要です。
/usr/lib/cgi-bin/test.cgiに以下を記述します。
#!/bin/sh eval $QUERY_STRING echo 'Content-type: text/html' echo '' echo '<html lang="ja" >' echo '<meta charset="UTF-8">' echo '<head></head>' echo '<h1>Result</h1>' echo_html(){ echo "<h3>${@}</h3>" echo "<pre>" eval $@ echo "</pre>" } echo_html whoami echo_html systemctl status nginx echo_html systemctl status fcgiwrap echo '<body>'
(URL)
https://(配置したホスト)/cgi-bin/test.cgi
このURLにアクセスしたら上記のコマンドが実⾏されます。
※CGIファイルに記述ミスがあると502エラーになります。
ニッチなニーズかと思います。