/널

2010-03-24 5 views
5

나는 아래와 같은 명령을 실행하는 응용 프로그램이 : 나는 <command>를 구성 할 수 있습니다/널

<command> <switches> >& /dev/null

을,하지만 난 <switches> 제어 할 수 없습니다. 이 명령으로 생성 된 모든 출력은 /dev/null입니다. 출력을 화면에 표시하거나 로그 파일로 리디렉션하고 싶습니다.

freopen() 및 관련 함수를 사용하여 /dev/null을 다른 파일로 다시 열려고했지만 작동하지 못했습니다.

다른 아이디어가 있습니까? 이것이 가능합니까?

감사합니다.

추신 : 전 Linux에서 작업하고 있습니다.

+0

이것이 펄 할 필요가 않습니다 : 위키 백과에서

예는 명령의 에스컬레이션을 허용하는? –

+0

스크립트에서 명령을 변경할 수있는 경우가 아니면 운이 없다고 생각합니다. 널 (null)로 리디렉션되면 공유 할 수있는 모든 파일 설명자 (stdin, stdout, stderr)가 없어지기 때문에 다시 가져올 수 없습니다. – tvanfosson

+0

그래서 명령을 제어 할 수는 있지만 리디렉션은하지 못합니까? 만약 그렇다면, e-t172가 올바른지, 아니면 적어도 당신이 얻는 것만 큼 적절하다고 말하고 싶습니다. http://stackoverflow.com/questions/2507569/how-to-redirect-output-away-from -dev-null/2507624 # 2507624 그렇지 않다면 명확히하기 위해 업데이트하십시오. –

답변

4

실행중인 명령을 수정할 수 있으므로 출력을 파일로 재지 정하는 래퍼로 간단한 쉘 스크립트를 사용할 수 있습니다. 당신이 capture_output.sh 같은 경로에이를 저장하면

#!/bin/bash 
"[email protected]" >> logfile 

는 당신은 로그 파일하는 프로그램의 출력을 추가 할 명령의 시작 capture_output.sh를 추가 할 수 있습니다. 스크립트의 시작 부분에

open STDOUT, '>>', '/var/log/myscript.log'; 
open STDERR, '>>', '/var/log/myscript.err'; 

, 그리고 그 나머지를 리디렉션 할 수 있습니다 : 당신은 그냥 약간 더 유용 뭔가 STDOUT을 재 지정하려면 펄에서

7

끔찍한 해킹 :

은 '을/dev/null /'발견, 응용 프로그램을 열 바이너리 모드에서 텍스트 편집기를 사용하고 동일한 길이

e.g '~/tmp/log' 
  • 메이크업의 문자열로 교체
  • 먼저 백업
  • 매우주의 하시고는
  • 내가 백업을 언급 했느냐주의 하시고?
+0

설명 : 텍스트 편집기로 이진 실행 파일을 엽니 다. 이진 파일의 횡설수설 어딘가에 "/ dev/null"이 있어야합니다. – Ricket

+0

@lexu : 이전에 했었는데,/dev/null을 공백으로 묶어서 같은 길이로 바꿨다.이 방법이 효과적이지만, 모든 응용 프로그램 버전에서 실행 파일을 해킹하는 것은 지겨운 일이다 ... 몇 가지 리디렉션 해킹을 수행하는 프로그램 작성을 생각하고 . 이것은 한 번의 노력 일 것입니다. 동반 목록에 대해서는 – Gowtham

+1

+1. –

2

명령 끝 부분에 #을 추가하면 <command> # >& /dev/null이되어 원하지 않는 부분을 주석 처리합니다.

+0

@ e-t172 : 좋은 생각입니다. 나는 을 언급하는 것을 잊었다. 이 명령은 '> – Gowtham

1

해당 명령에 대한 별명을 작성할 수 있습니까? 그렇다면 출력을 파일에 덤프하는 다른 명령에 별명을 지정하십시오.

0

편집 : 이것은 좋은 생각이 아니며, 이것이 깨뜨릴 수있는 것을 알지 못하면 시도 할 가치가 없습니다. 그것은 나를 위해 일하고뿐만 아니라 당신을 위해 일할 수 있습니다.

좋아, 이건 정말 나쁜 해킹이고 아마도 가치가 없어. 다른 명령 중 아무 것도 작동하지 않는다고 가정하면 이진/응용 프로그램 (/dev/null이 포함 된 명령)에 액세스 할 수 없으며 /dev/null을 바꾸어 다른 파일로 출력을 재 지정할 수 없습니다.

그런 다음/dev/null ($> rm /dev/null)을 삭제하고 모든 데이터를 전송할 수있는 위치에 자신의 파일을 만들 수 있습니다 (소프트 링크 포함). 이 나쁜 해킹 입니다

$> mknod -m 666 /dev/null c 1 3

그냥 아주 명확하고 확실하게 작업에 루트 권한이 필요합니다 작업이 완료되면 다음 명령을 사용하여 다시 한번을/dev/null을 만들 수 있습니다 . 리디렉션 된 파일에는 실행중인 다른 많은 응용 프로그램/바이너리의 데이터가 포함될 수 있으며 /dev/null을 싱크대로 사용할 가능성이 큽니다.

+0

으로 추가됩니다. 추가하기 만하면, 2.6.30 실행중인 페도라 인 컴퓨터에서이 작업을 시도했습니다. 이 정보는 다른 플랫폼/환경에서 mknod의 주 번호와 부 번호가 다를 수 있기 때문에 중요합니다. – Shrey

+0

'why-my-answer-was-down-down'이 주석으로 설명되는 것이 좋을 것입니다. 나는 이것이 해킹 (분명하게 조용히 언급 됨)임을 알고 있으며 포스터가 "... 그러나 나는 통제 할 수 없다"고 명시 적으로 말하고있다. – Shrey

+0

/dev/null을 제거하면 해킹을 넘어서게됩니다. 그것은 완전히 깨진 생각입니다. 그것은 대상 스크립트/프로그램뿐만 아니라 전체 시스템 (경로명에 대한 새로운 모든 열림)에 영향을 미칩니다. 끝나면 "고정"되어야합니다. 그리고 루트 액세스가 필요합니다.해답은 "redirect/dev/null"이 아니라 원래/dev/null에서 열었던 기존의 설명자를 다시 여는 것입니다. –

1

장치 파일 /dev/tty는 응용 프로그램의 제어 터미널을 참조 - 그 변경되지 않은 경우,이 작동해야합니다, 또는

freopen("/dev/tty", "w", stdout); 
freopen("/dev/tty", "w", stderr); 

당신이 로그 파일을 가리 키도록 그들을 다시 열 수 있습니다 :

freopen("/var/log/myapp.log", "a", stdout); 
freopen("/var/log/myapp.err", "a", stderr); 
2

응용 프로그램에서 셸을 실행하고 해당 명령 줄을 전달한 것 같습니다.

당신이 작성한 스크립트를 실행해야합니다. 이 스크립트는 명령 행에서 >/dev/null>>/your/log으로 대체하고 수정 된 명령 행을 사용하여 실제 쉘을 호출합니다.

첫 번째 단계는 응용 프로그램에서 사용하는 셸을 변경하는 것입니다. 그래도 문제가 해결되지 않으면, 즉 충분해야 SHELL 변수 환경을 변경

SHELL=/home/user/bin/myshell theApp 

로 응용 프로그램을 실행, 순간적으로 스크립트에 /bin/sh를 연결하려고합니다.

myshell는 원래의 쉘을 부르지 만, 패턴 대체 매개 변수 후됩니다 이러한 라인을 따라

#!/bin/bash 
sh ${1+"${@/\>\/dev\/null/>>\/your\/log}"} 

뭔가 작동합니다.

0

, 당신은 뭔가를 할 수 있습니다 스크립트의 전자 t172의 대답의 라인을 따라

0

, 당신은 마지막 스위치를 (또는에 추가) 할 수 있습니다

; echo 
1

그것은 정확히 리디렉션 할 수 있지만, 그것은 존재의 어디든지 출력을 얻을 수 있습니다 하지만 작품 : 그것은 그 CLEEN입니다 (쓰기 (#)와 같은 라인을 보여줍니다)

strace -ewrite -p $PID

을 보냈습니다! (그리고 단 한 줄 : D) 인자가 축약된다는 사실을 싫어할 수도 있습니다. 이를 제어하려면 문자열의 최대 길이를 설정하는 -s 매개 변수를 사용하십시오.

모든 스트림을 잡아서, 어떻게 든 필터링 할 수 있습니다.

당신은 그것을 필터링 할 수 있습니다

strace -ewrite -p $PID 2>&1 | grep "write(1"

는 설명 1 호출을 보여줍니다. 2> & 1은 stderr을 stdout에 리디렉션합니다.

0

하드 코딩 된 명령을 처리하는 경우 확실하지 않은 것을/dev/null에 전달하기 전에 인라인을 넣을 수 있다면 tee을 사용하여 원하는 대상으로 리디렉션 할 수 있습니다.

echo "Body of file..." | sudo tee root_owned_file > /dev/null 

http://en.wikipedia.org/wiki/Tee_(command)