質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

PHP

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

Q&A

解決済

2回答

2677閲覧

ブラウザで実行はできるのにcronだと実行できない原因は?

coinbura

総合スコア106

cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

PHP

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

0グッド

0クリップ

投稿2018/06/23 08:51

編集2018/06/23 09:02

cronを用いて以下test.phpを実行し、SSHのコマンドを実行しようとしています。

test.phpの中身

<?php include __DIR__.'/Net/SSH2.php'; $ssh = new Net_SSH2('サーバーアドレス'); if (!$ssh->login('ユーザー名', 'パスワード')) { exit('ログイン失敗'); } echo $ssh->exec('コマンド'); ?>

この時、ブラウザのアドレスバーにURLを入力してtest.phpを実行するとコマンドは実行されるのに、cronで実行させると、以下のようなエラーが出て動きません。

PHP Notice: No compatible server to client encryption algorithms found in /home/test.jp/public_html/Net/SSH2.php on line 1561

パーミッションは755に設定しています。

一体何が原因で動かないのでしょうか?
同じファイルを参照しているはずなのに、ブラウザとcronで実行結果が変わるということは有りうるのでしょうか?

追記.
1561行目付近のコードは以下になります(1561は「user_error('No comp…」)。

// we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange // we don't initialize any crypto-objects, yet - we do that, later. for now, we need the lengths to make the // diffie-hellman key exchange as fast as possible $decrypt = $this->_array_intersect_first($encryption_algorithms, $this->encryption_algorithms_server_to_client); $decryptKeyLength = $this->_encryption_algorithm_to_key_size($decrypt); if ($decryptKeyLength === null) { user_error('No compatible server to client encryption algorithms found'); return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); }

なんの事かさっぱり分かりません。。。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/06/23 13:47

1. 利用しているPHPはPHPか(インストールパス、バージョン)
退会済みユーザー

退会済みユーザー

2018/06/23 13:47

2. 利用している php.ini は同じ php.ini か
退会済みユーザー

退会済みユーザー

2018/06/23 13:47

3. httpd で呼び出しているときに設定を変更してないか (htaccess, *.php)
退会済みユーザー

退会済みユーザー

2018/06/23 13:48

4. 実行ユーザーは同じか
coinbura

2018/06/23 14:08

1.PHPは普通のPHPです(バージョンは7.2.6) 2.php.iniはcronのコマンド上で場所指定してるので同じもの。 3.と4.は不明です。
coinbura

2018/06/23 14:09

ちなみにcronを実行しているサーバーはエックスサーバーで、test.phpは他サーバー(VPS)にSSH接続する仕様です。
退会済みユーザー

退会済みユーザー

2018/06/24 12:26

不明じゃなく調べなさい
coinbura

2018/06/24 13:05

いくら調べても分かりませんでした。そもそも質問の意味がよく分かっていません。
guest

回答2

0

ベストアンサー

同じファイルを参照しているはずなのに、ブラウザとcronで実行結果が変わるということは有りうるのでしょうか?

一般論としては、
・実行ユーザーの違い
・プロセス固有データ(環境変数、カレントディレクトリ、umask)の違い
・標準入力、標準出力など、ファイルディスクリプタの先のファイル等の違い
などで、実行状況が変わり得ます。
初心者の間違いで多いのが環境変数の違いですね。

投稿2018/06/23 13:56

otn

総合スコア84499

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

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

coinbura

2018/06/23 14:19 編集

うーん、なかなかに難しいものなのですね。 cronの実行環境がレンタルサーバーなので、たぶん実行ユーザーは同じのような気がするし、 「ファイルディスクリプタの先のファイル」はググっても意味が分からなかったし、 まずは、おっしゃるように、(よく分かってませんが)環境変数を1つずつとりだして確認してみようと思います。
otn

2018/06/23 14:28

system('(id;pwd;env) >/tmp/id-pwd-env.txt'); とでも先頭に入れて、見比べてください。/tmpにアクセス権が無い場合はどこか書ける場所に。 他は多分大丈夫でしょう。 プログラムは見てないので、あくまで一般論です。
coinbura

2018/06/24 10:34

色々調べてはみたのですが、system('(id;pwd;env) >/tmp/id-pwd-env.txt')が何なのか。どこの先頭に入れるのかが分からずに断念しました。 せっかく教えていただいたのに、すみません。
otn

2018/06/24 12:23

> どこの先頭 プログラムに決まっているじゃないですか。PHPをよく知らないということでしょうか?
coinbura

2018/06/24 13:11

PHPが若干分かっているくらいで、SSHのコマンド(?)はよく分かっていない感じです。 空のPHPファイルを作ってsystem('(id;pwd;env) >/tmp/id-pwd-env.txt');を入れてみたのですが動かず。 レンタルサーバーのcron管理画面内のコマンドに入れても動かず。 これが何の言語かググったりもしたのですが、よく分かりませんでした。
coinbura

2018/06/24 13:25

とりあえず、質問をするレベルの知識が今の自分にないと感じたので、「同じファイルを参照しているはずなのに、ブラウザとcronで実行結果が変わるということは有りうるのか」が分かっただけでも良しとすることにしました(^^ゞ 実行ユーザーとは何か、system('(id;pwd;env) >/tmp/id-pwd-env.txt')とは何か、をじっくりと調べてみようと思います。
guest

0

同じファイルを参照しているはずなのに、ブラウザとcronで実行結果が変わるということは有りうるのでしょうか?

もちろん、あるよ。Unix/Linux系ではね。

/home/test.jp/public_html/Net/SSH2.php on line 1561

で、何してるか見てみ。

投稿2018/06/23 08:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

coinbura

2018/06/23 09:07

>もちろん、あるよ。Unix/Linux系ではね。 なるほど。そこら辺が解決への糸口なのですかね・・・ 1561は一応見てみたのですが、cron側のエラーと同じような内容が書かれているだけで、見ても解決できそうにありませんでした。
退会済みユーザー

退会済みユーザー

2018/06/23 09:09

だから、そのへんのコードを見せないとさ。何やろとしてコケたのかわかんないじゃん。 トラブル解決って、常にそんな感じよ。
coinbura

2018/06/23 09:31

なるほど。 どこまでコピペすればいいか分かんなかったので、とりあえず上記の4倍くらいコピペしてみました。 1561行目は、 user_error('No compatible server to client encryption algorithms found');です。 全ソースは以下。 https://ja.osdn.net/projects/sfnet_phpseclib/releases/ --------------------------------------------------------- if (!strlen($response)) { return false; } extract(unpack('Cfirst_kex_packet_follows', $this->_string_shift($response, 1))); $first_kex_packet_follows = $first_kex_packet_follows != 0; if (!$this->send_kex_first && !$this->_send_binary_packet($kexinit_payload_client)) { return false; } // we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange // we don't initialize any crypto-objects, yet - we do that, later. for now, we need the lengths to make the // diffie-hellman key exchange as fast as possible $decrypt = $this->_array_intersect_first($encryption_algorithms, $this->encryption_algorithms_server_to_client); $decryptKeyLength = $this->_encryption_algorithm_to_key_size($decrypt); if ($decryptKeyLength === null) { user_error('No compatible server to client encryption algorithms found'); return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); } $encrypt = $this->_array_intersect_first($encryption_algorithms, $this->encryption_algorithms_client_to_server); $encryptKeyLength = $this->_encryption_algorithm_to_key_size($encrypt); if ($encryptKeyLength === null) { user_error('No compatible client to server encryption algorithms found'); return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); } $keyLength = $decryptKeyLength > $encryptKeyLength ? $decryptKeyLength : $encryptKeyLength; // through diffie-hellman key exchange a symmetric key is obtained $kex_algorithm = $this->_array_intersect_first($kex_algorithms, $this->kex_algorithms); if ($kex_algorithm === false) { user_error('No compatible key exchange algorithms found'); return $this->_disconnect(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問