🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

1688閲覧

PHPのコードの中で、シェルスクプトを実行したいです。

退会済みユーザー

退会済みユーザー

総合スコア0

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2020/12/25 10:02

編集2020/12/27 14:59

#!/bin/sh
for i in seq $1
do
iperf -c $2
done

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/25 10:16

「うまくいきませんでした」とおっしゃっていますが、質問者さんがどういう状況でどういう条件でそれを実行しているのかさっぱりわからないので、実行環境に関する説明を補ってはいかがでしょうか。CentOSだのUbuntuだのとかそのOSのバージョンとか、phpはバージョンいくつか、などなど。
退会済みユーザー

退会済みユーザー

2020/12/25 10:25

申し訳ございません。 プログラミングも、このサイトも初心者なので.... OSはmacOSです。 PHPのバージョンは7.3.11です。
javahack

2020/12/26 17:20

PHPとシェルスクリプトは別のプログラムなので、まず動作するシェルスクリプトを完成させて、それをPHPから呼び出すというように考え方を変えましょう。
退会済みユーザー

退会済みユーザー

2020/12/26 17:43

ありがとうございます。 他の回答者さんからご教授していただいたおかげで、なんとかシェルスクリプトは完成させることができました。
guest

回答2

0

質問に記載されているシェルスクリプトをコマンドラインから実行したら動くのでしょうか?


いろいろ不明ですが... 確実な部分だけ...

シェルスクリプト内の txtA とか txtB とか txtC は、コマンドラインから渡すパラメータということですか?

シェルスクリプトにコマンドラインから渡したパラメータを シェルスクリプトの中で参照する場合は、1つめから順番に $1, $2, $3, ... $9 のような名前になります。

投稿2020/12/25 10:20

編集2020/12/25 10:21
CHERRY

総合スコア25216

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/25 10:31

申し訳ございません... このシェルスクリプトを、コマンドラインから実行したら、txtAなどが原因で動きませんでした。 txtA,txtB,txtCはphp内で書かれたものでして、この3つを引数として、このシェルスクリプトに持ってきって、php内で実行したいです。 ですがこのphp側から持ってきた引数を記述する方法があっているかどうかわからなくて困っていました。
退会済みユーザー

退会済みユーザー

2020/12/25 10:35

ということは、変数$1にtxtA、$2にtxtB、$3にtxtCが入っているということで良いのでしょうか?
CHERRY

2020/12/25 10:43

PHPの変数が 文字列 であれば、そうなります。
退会済みユーザー

退会済みユーザー

2020/12/25 10:51

ありがとうございます。 さらに質問で申し訳ないのですが、ここからPHPで起動したサイトから、txtBにIPアドレスが入力され、txtCには、その結果を出力するファイル名が入力されるのですが、 command="iperf -c $2" eval $command >> $3 入力されたIPアドレスに、iperfを使用して、ネットワークのスループットを計測して、それをtxtCというファイル名にして結果をPHPで起動したサイト上に出力したいのですが上記のような書き方で、あっているでしょうか?
CHERRY

2020/12/25 11:03 編集

正しいかどうかは、書いて実行してみたらわかりますので、まずは、 cmd.sh を編集して、コマンドラインからパラメータを与えて実行してみましょう。 その結果、エラーメッセージが出ているのであれば、質問にエラーメッセージを具体的に記載してください。
退会済みユーザー

退会済みユーザー

2020/12/25 11:34

ありがとうございます。 MacBook-Pro ~ % chmod u+x cmd.sh 1 "IPアドレス" file chmod: cmd.sh 1: No such file or directory chmod: IPアドレス: No such file or directory chmod: file: No such file or directory このようにNo such file or directoryと出てきますが、パラメータの指定の方法が間違っているのでしょうか?
退会済みユーザー

退会済みユーザー

2020/12/25 11:36

IPアドレスは自分のパソコンのIPアドレスを入力したので、[IPアドレス]と書かせていただきました。
CHERRY

2020/12/25 12:02 編集

> chmod u+x cmd.sh 1 "IPアドレス" file コマンドがいろいろ混ざっていますね。 ---- コマンドを意味のあるように分けると chmod u+x cmd.sh は、cmd.sh に実行権限を設定するコマンド(1回だけ実行すれば OK ) cmd.sh 1 "IPアドレス" file が、実行したいコマンド の2つに別れます。 ふたつのコマンドは、2回にわけて実行する必要があります。
退会済みユーザー

退会済みユーザー

2020/12/25 11:54 編集

ありがとうございます。2回に分けて実行してみたのですが、 MacBook-Pro Desktop % chmod u+x cmd.sh MacBook-Pro Desktop % cmd.sh "1" "IPアドレス" "file" zsh: command not found: cmd.sh と1回目は通ったのですが、2回目でcommand not foundが出てきてしまいました。 同じディレクトリで実行しているのですが、cmd.shが無いということなのでしょうか?
CHERRY

2020/12/25 12:01

はい。 環境変数 PATH に登録されていないディレクトリの実行ファイルは、 絶対パス か 相対パス で、ディレクトリも含めて指定する必要があります。 現在いるディレクトリ( カレントディレクトリ )に実行したいファイルがある場合は、 ./cmd.sh のように ./ をつけます。  . が 現在のディレクトリという指定です。
退会済みユーザー

退会済みユーザー

2020/12/25 12:11 編集

ありがとうございます。実行してみたら、 MacBook-Pro Desktop % ./cmd.sh "1" "IPアドレス" "file" usage: seq [-w] [-f format] [-s string] [-t string] [first [incr]] last とエラーが出てきたのですが、seq〜と出ているあたり、ループ処理をしているシェルスクリプトの中の、seqコマンドの書き方が何かおかしかったのでしょうか? 引数を使わないで、そのままループの回数や、IPアドレスをそのままシェルスクリプト内に入力した場合には、できたのですが、、
guest

0

とりあえずシェルスクリプトの中の関数定義・呼び出しとevalは不要なのでやめましょう。

#!/bin/sh for i in `seq $1` do iperf -c $2 >> $3 done

これをコマンドラインから呼び出したらどうなりますか?


(2020/12/27 10:08 追記)
上記でうまく動くようであれば、以下でどうですか?

#!/bin/sh for i in `seq $1` do iperf -c $2 done

PHP

1<?php 2$txtA = 1; 3$txtB = '192.168.0.9'; 4$output = shell_exec('./cmd.sh "' . $txtA . '" "' . $txtB . '"'); 5print_r($output);

OSコマンドインジェクション脆弱性がありますが、$txtAと$txtBが外部から変更できない場合は問題ありません。

投稿2020/12/26 15:42

編集2020/12/27 01:08
ockeghem

総合スコア11705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/26 16:33

ありがとうございます。 引数を指定して、コマンドラインから実行したら、ちゃんとファイルが作成されて、結果が保存されていました。 さらに質問で申し訳ないのですが、ここからPHP側からこのシェルスクリプトを呼び出して、実行して、PHPのサイト上にこの結果を表示したいです。 上記の質問のPHPのコードで実行してみても、打ったコードがこのまま表示されてしまいます。 質問ばかりで申し訳ないのですが、どうかご教授お願いします。
退会済みユーザー

退会済みユーザー

2020/12/26 17:40

ありがとうございます。 マニュアルをみて、下記のように書いてみました。 <?php $output = shell_exec('sh ./cmd.sh "'.$txtA.'""'.$txtC.'" "'.$txtC.'"'); echo "<pre>$output</pre>"; ?> しかし、やはり表示画面には<pre></pre>しか表示されませんでした。 引数を指定するときは、" '. .' " で囲うことで引数を渡せると、他のサイトに書いてあったのですが、何がダメなのでしょうか?
ockeghem

2020/12/27 14:08

いったんは作ってみたのですが、これ、明らかに業務で使うものですよね。それのデバッグ…というより開発に近い作業を丸投げで依頼するのはどうなんですかね。 あと、この形だとOSコマンドインジェクション脆弱性になりますので、極めて危険です。
hentaiman

2020/12/27 14:16

> マニュアルをみて、下記のように書いてみました。 なんでやねん 「出力」の意味が分からないのなら各回答者に教えてもらったコマンドで作成出来たファイル(txtCに当たるもの)をphp側からOPENして読み込み処理を作る事をおすすめします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問