2011-09-14 5 views
0

PHP를 사용하여 Windows에서 쉘 스크립트를 만들려고합니다. 더 큰 기능 중 일부입니다. "- 그런 파일이나 디렉토리 잘못된 인터프리터"오류이 파일이 서버에 도착하면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를 사용하지 않는 이유는 서버에 설치해야 할 것이므로 사용할 수있는 것이 필요하기 때문입니다. 우분투 상자.

감사합니다.

편집는 :

난 그냥 preg_replace이다를 사용하여 문자열을 정리하는 방법을 발견했다. 이 나를 위해 어떤 문제없이 작동

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

:

여기에 (물론, 이미 위에서 게시 된 코드에서 계속) 코드입니다.

+0

창을 사용하지 마십시오?/me laughs 그러나 텍스트 편집기에는 Unix 호환 줄 바꿈 옵션이 있어야합니다. 나는 그것들을 들여다보고 그것을 사용하고 있는지 확인합니다. –

+0

@ 브래드 : 셸 스크립트를 작성하고 문제가 없을 때 메모장 ++을 사용합니다. 그러나,이 인스턴스에서 PHP (Zend Studio 8 사용)에 쉘 스크립트 컨텐츠가 필요합니다. –

+0

절대로 사용하지 마십시오. 그러나 Windows에 append 한 것처럼 줄 바꿈을 UNIX 스타일로 설정하는 설정이 있어야합니다. 저를 둘러싼 코딩은 나쁜 습관이 될 것입니다. 소스에서 문제를 해결하고 해킹하지 않는 것이 좋습니다. 그러나 각자 자신에게. Zend Studio에 대한 도움이 필요하면 http://forums.zend.com/viewtopic.php?f=50&t=2158 및 http://forums.zend.com/viewtopic.php를 찾으셨습니까?fend = 59 & t = 3799 Zend가 왜 이런 실수를 저지를 지 모르겠다. –

답변

1

나는 가정 당신은 에디터 제를 사용하는 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이 보입니다. –