2011-09-14 8 views
0

Windowsでシェルスクリプトを作成するためにPHPを使用しようとしています。より大きな機能性の一部です。ここでWindowsからPHPでUNIXセーフテストを作成する

は私のスクリプトです: - エラーこのファイルはサーバー上になったとき

$contents_str = ''. 
'#!/bin/bash 
yes | apt-get update 
yes | apt-get upgrade 
useradd sudoer -g sudo -s /bin/bash -m 
echo "sudoer:sudoerpass" | chpasswd'; 

しかし、私は「そのようなファイルやディレクトリ悪いインタプリタ」を取得します。私はファイルにいくつかの隠された窓の文字があるので、それが分かっています。

PHPで隠しウィンドウ文字を削除するための関数やスクリプトはありますか?あるいは、サーバーでこれを行うために使用できる単一のbashコマンドがありますか?

私はファイルにdos2unixを使用しましたが、これを行った後に動作しますが、サーバーにインストールする必要があり、すぐに使えるものが必要なのでdos2unixを使用したくないですUbuntuボックス。

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

EDIT

私はちょうどにpreg_replaceを使用して文字列をクリーンアップする方法を見つけました。これは私のために何の問題もなく働いた

$contents_nixsafe_str = preg_replace('/(\r\n|\r|\n)/s', "\n" , $contents_str); 

は、ここで(もちろん、私はすでに上記掲載のコードから継続)のコードです。

+0

ウィンドウを使用しないでください。/me laughsしかし、テキストエディタには、Unix互換の改行オプションが必要です。私はそれを調べ、それがそれらを使用していることを確認するでしょう。 –

+0

@ブラッド:私はシェルスクリプトを書こうとするときにNotepad ++を使用しますが、問題はありません。しかし、この例では、PHP(Zend Studio 8を使用している)にシェルスクリプトの内容が必要です。 –

+0

これは決して使用しませんが、Windowsに合わせて改行をUNIXスタイルに設定する必要があります。それを私の周りに記述するのは悪い習慣です。ソースで問題を解決し、ハックしない方がよい。しかし、それぞれ自分自身に。 Zend Studioのサポートについては、http://forums.zend.com/viewtopic.php?f=50&t=2158とhttp://forums.zend.com/viewtopic.phpを参照してください。f = 59&t = 3799なぜ私はZendがこのような失敗を起こすのかよく分かりませんが、まあまあです。 –

答えて

1

私はあなたがエディタthを使用していると仮定しますWindowsのCRLF形式で出力行末(EOL)文字を出力します。エディタによっては、代わりにUNIXの行末(LF)を使用するように指示することができます。

また、あなたが一緒に行を連結することができますし、手動でEOL文字追加します。それは醜いですが、仕事を取得し

$contents_str = '' 
    .'#!/bin/bash'."\n" 
    .'yes | apt-get update'."\n" 
    .'yes | apt-get upgrade'."\n" 
    .'useradd sudoer -g sudo -s /bin/bash -m'."\n" 
    .'echo "sudoer:sudoerpass" | chpasswd'; 

を。

+0

私はどんな日の仲間でも働かないのは醜いです。ありがとう、これは私のためにそれをしました。テキストエディタ(Notepad ++)でシェルスクリプトを作成しても問題はありませんが、この場合はPHPコードに埋め込む必要がありました。だからあなたの提案は魅力的に機能しました。 –

+0

私はあなたが何を言っているのか理解していますが、PHPスクリプトを書くために使用するエディタは、まず問題を引き起こした可能性が高いものです。私は助けになることができてうれしい。 – simshaun

+0

私はZend Studio 8を使用しています。私はちょうどpreg_replaceを使ってこれを行う方法を見つけました。すぐにコードを投稿します。 –

0

$contents_str = str_replace("\r\n", PHP_EOL, $contents_str); 

また、一定のシステム改行で改行を交換してくださいすべての回答について

おかげで、あなたが開始する複数行の文字列を作成するためheredoc構文を見てみたいし、文字列を終了してもよいです特別な識別子(この例ではSTR):

$contents_str = <<<STR 
#!/bin/bash 
yes | apt-get update 
yes | apt-get upgrade 
useradd sudoer -g sudo -s /bin/bash -m 
echo "sudoer:sudoerpass" | chpasswd 
STR; 
+0

私はこれらの両方を試みましたが、うまくいきませんでした。しかし、提案してくれてありがとう、私はheredoc構文で何か新しいことを学んだ。 –

+0

それは面白いです。たぶん、置換は '\ r'または' \ n'を探すべきであり、両方を探すべきではないでしょう。 'PHP_EOL'は、スクリプトが実行されているマシンで終わる正しい行でなければなりません。とにかく運が良かった。 –

+0

もう一度やりましたが、それでもうまくいきませんでした。 str_replaceが正しい関数であるかどうかはわかりません。私は上記で投稿したpreg_replaceで何かを見つけました。ありがとう。 –

0
$contents_arr = array 
(
    '#!/bin/bash', 
    'yes | apt-get update', 
    'yes | apt-get upgrade', 
    'useradd sudoer -g sudo -s /bin/bash -m', 
    'echo "sudoer:sudoerpass" | chpasswd' 
); 

$contents_str = implode("\n", $contents_arr); 
+0

ありがとうございました。私はこれを試しましたが、うまくいきません。 cat -vを使ってファイルを開くと、まだ^ Mが表示されます。 –

関連する問題