2013-07-30 2 views
0

system("insert shell command here")을 사용하고 스크립트를 전달하고 싶습니다. 그러나이 스크립트는 사용자 입력이 필요합니다. 나는 또한 사용자 입력을 전달하고 싶다. 어떻게해야합니까? system() 명령을 사용하여 사용자 입력을 전달하는 방법은 무엇입니까?

나는 시도 : 첫 번째 시스템 호출을 완료하고 만 다음 단계로 이동합니다 진행 될 때까지

system('./script') 
system('input1') 
system('input2') 

그러나, 루비 기다립니다.

가능합니까? 내가 시도했습니다 system('./script', 'input1')하지만 그 중 하나를 작동하지 않았다. 행운 없음 exec 중 하나.

+0

당신은 사용자의 입력이 스크립트에해야 무엇을 파이프에 싶어? 그 스크립트가 입력을 검색하는 방법은 무엇입니까? 인증 인 경우 일반적으로 암호 입력은 STDIN이 아닌 TTY 또는 KBD 장치에서만 허용되기 때문에 일반적으로 실패합니다. –

답변

1

당신은 루비 다음 stdlib에서 Open3 library에 보일 것입니다. 그것은 당신에게 "포격"에 대한 통제권을 부여합니다.

output, status = Open3.capture2("./script", :stdin_data => "I am STDIN") 
+0

흠 좋습니다.하지만 이것은 외부 라이브러리를 사용하지 않고는 불가능합니다. – user1530318

+1

어떤 외부 라이브러리입니까? Open3은 Ruby의 일부입니다. –

+0

이 스크립트는 호출중인 스크립트가 인증을 수행하지 않는 한 작동해야합니다. KBD 또는 TTY 장치에서 입력을 스푸핑하지 않으면 OP가 SOL입니다. –

-1
#!/usr/bin env ruby 

input1 = ARGV[0] 
input2 = ARGV[1] 

system("./script #{input1} #{input2}") 
+0

'ARGV [0]'이'; rm -rf /'? 그것이 무엇을하는지 보려고하지 마십시오. –

+0

좋은 지적. 그래, 그걸 조심해야 해. rm -rf/commands를 피하기 위해 if 조건을 넣을 수 있습니다. 엄지 손가락의 규칙은 받아 들일 수있는 것을 정의한 다음 다른 모든 것을 거부합니다. 쉘 워드도보실 수 있습니다. – eastafri

+1

['system'] (http://ruby-doc.org/core-2.0/Kernel.html#method-i-system)이 쉘을 우회 할 수있는 모든 것을 왜 귀찮게합니까? 완전히? 'system' 명령을 구현하기위한 문자열 보간은 거의 결코 좋은 생각이 아닙니다. SQL에 문자열 보간법을 사용하는 것이 거의 결코 좋은 생각이 아닙니다. –

관련 문제