2017-11-25 15 views
0

bash printf "\x00\x00\xFF\x00" | dd bs=4 seek=$(($y*$width+$x)) of=/dev/fb0에서 은 모니터 픽셀의 너비이므로 x, y 좌표의 빨간색 픽셀을 화면에 표시 할 수 있습니다.16 진수로 파이썬 하위 프로세스

저는 파이썬을 사용하여 이미지의 색상 값을 검색하고 이전 bash 명령을 호출하고 파이썬에서 찾은 값을 넣기를 원합니다. 내가 가진 하위 프로세스 호출하면

는 다음 \x 문자 서브 프로세스가 작동하지 않으면

Traceback (most recent call last): 
File "./sub.py", line 30, in <module> 
subprocess.call(command, shell=True) 
File "/usr/lib/python2.7/subprocess.py", line 522, in call 
return Popen(*popenargs, **kwargs).wait() 
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__ 
errread, errwrite) 
File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child 
raise child_exception 
TypeError: execv() arg 2 must contain only strings 

:

command = 'printf "\x00\x00\xFF\x00" | dd bs=4 seek=276200 of=/dev/fb' 
subprocess.call(command, shell=True) 

을 나는이 오류가 발생합니다. Formatting a command in python subprocess popen 을하지만 난 정말 그것을 얻을하지 않습니다

command = 'printf "test" | dd bs=4 seek=2 of=test.txt' 
subprocess.call(command, shell=True) 

나는이 같은 몇 가지 흥미로운 링크를 발견했다. 서브 프로세스에 \x 문자를 넣을 수 있습니까? 어떻게? 다른 방법이 있습니까? 모든

먼저 당신의 도움에 대해 감사합니다 :

은 대단히

EDIT 감사드립니다.

나는 트릭을하는 것을 발견했습니다. 나는 이것이 이것을하는 가장 좋은 방법이라고 생각하지 않지만 그것이 효과가있다.

printf "\x00\x00\xFF\x00"은 정상적으로 작동하며 이상한 문자 을 인쇄합니다. 그러나 파이썬 서브 프로세스 subprocess.call('printf "\x00\x00\xFF\x00"', shell=True)에서 호출하면 오류 TypeError: execv() arg 2 must contain only strings가 발생합니다. 이처럼 백 슬래시를 벗어날 때 subprocess.call('printf "\\x00\\x00\\xFF\\x00"', shell=True)이 아닌 \x00\x00\xFF\x00을 출력하므로 터미널에서 바로 printf와 똑같지는 않습니다. 나는 여러 가지 다른 방법으로 도피하려했지만 을 얻지 못했습니다. 나는 이유를 정확히 모른다.

그래서 이런 작은 printf.bash 파일을 만든 :

#!/bin/bash 
printf $1 

을 그리고이 같은 서브 프로세스를 호출하고 있습니다 :

subprocess.call('./printf.bash "\\x00\\x00\\xFF\\x00"', shell=True) 

나는 내가 원하는 를 얻을.

subprocess.call('printf "\\x00\\x00\\xFF\\x00"', shell=True) 

당신이

+0

이진 데이터가 들어있는 문자열을 명령 줄 인수로 셸에 전달할 수있는 방법이 있습니까? 있다면, 그것을 사용하는'command' 문자열을 생성하십시오. – martineau

+2

왜'subprocess'를 사용하고 있습니까? 파일을 열고 Python에서 직접 파일에 쓸 수 있습니다. 'with open ("/ dev/fb", "wb")을 fb : fb.seek (276200); fd.write ('\ x00 \ x00 \ xff \ x00')' – chepner

+0

고마워, 몰랐어, 재미있어 보인다. 이걸 시험해 보겠다.'dd' 옵션'bs = 4'은 어떨까? fb.seek와? – Lucien

답변

3

백 슬래시를 탈출 시도 감사 : 이상하게도이 다릅니다.

command = 'printf "\\x00\\x00\\xFF\\x00" | dd bs=4 seek=276200 of=/dev/fb' 

편집 :

printf "\x000\x000\x0FF\x000" 

은 위의 작동 할 수 있습니다, I 및/여분의 선두 자리를 추가하려고 할 것하지 않을 경우 : 내 떠들썩한 파티에서 나는 문자가 실제로 표시에 대한 귀하의 printf를 변경해야 백 슬래시도 이스케이프 처리합니다. 편집 : 또는 파이썬의 원시 문자열 플래그를 제안 아래의 주석을 참조하십시오.참조 : py string literals

+0

예. 또는, 대신에'command = r 'printf "\ x00 \ x00 \ xFF \ x00"| dd bs = 4 seek = 276200 of = deleteme ''. – John1024