주요 콘텐츠로 건너뛰기

지난 주 (내가 이 글을 쓰기 시작했을 때 지난 주였음) 우리는 누군가가 시스템에 로그인하고 일부 명령을 실행하기 위해 텔넷을 실행하는 명령 매크로를 작성하고 싶었던 CAC에 문제가 있었습니다(예를 들어 명령 매크로test.cm 원격 호스트에 로그인하고 foo.cm 명령 매크로를 실행합니다.

& attach_input                                                                 
텔넷 192.168.77.128
암호
foo.cm

그림 1 – 텔넷 명령 매크로 test.cm

display_line display_system_usage                                             
display_system_usage
display_line 넷스타트 -통계 -프로토콜 tcp
넷스타트 -통계
display_line analyze_system -request_line 'stcp_meters -모두 -long' -quit
analyze_system -request_line 'stcp_meters'-종료

그림 2 – foo.cm

 

안타깝게도 텔넷은 명령 매크로에서 실행되도록 설계되지 않았으며 실패합니다.

테스트                                                                          
텔넷: 치명적인 오류 - tcgetattr 실패
테스트 3호선 오류.
command_processor: 개체를 찾을 수 없습니다. 암호. 명령 매크로에서
     %아즈보스#m17_mas>시스관리자>Noah_Davids>test.cm

그림 3 – test.cm 실행 실패

 

그러나 명령 실행 다음에 원격 호스트에 자동 마법 로그인을 수행하는 방법은 여러 가지가 있습니다.

send_cmds.c:

나는 텔넷 서버에 연결을 하고 문자열을 보내고 출력을 구문 분석하는 프로그램을 잠시 뒤로 작성했습니다. 스크립팅 언어는 간단하지만 간단한 것은 잘 작동합니다. 보다 광범위한 예제가 있는 소스 코드는 여기에서 찾을 수 있습니다.

스크립트는 기본적으로 보내기 문자열다음에 대기 문자열입니다. 매우 간단하게 말했듯이 스크립트는 대기 문자열을 볼 때 다음 줄로 진행됩니다. 스크립트에는 인수가 있으며 그림 4에서는 암호에 arg0을 사용하므로 암호가 스크립트에 저장되지 않습니다. 스크립트 실행은 그림 5에서 따릅니다. 공간을 절약하기 위해 각 명령의 출력을 잘렸습니다. 터미널 유형을 ascii로 설정할 때까지 문자 위치 지정 문자열의 비제어 문자가 표시됩니다.

로그인                                                                         
/로그인 nd/암호?
/arg0/ready
/set_terminal_parameters -terminal_type ascii-pause_lines 0/준비
/foo.cm/ready
/종료/종료

그림 4 – send_cmds 스크립트로 로그인하고 foo 명령 매크로를 실행합니다.

send_cmds -IP주소 192.168.77.128 -입력파일패스 test.send_cmds -no_Verbose -a
+rg0 암호

피닉스 CAC VOS 테스트 시스템 (%phx_vos#m16)

다른 VOS 릴리스에서 부팅하려면 ***
   >감독관>커먼>cfg>reconfig_instructions ***

오픈보스 출시 17.1.0ax, 모듈 %phx_vos#m16
로그인 하시기 바랍니다 08:15:01
로그인 nd
암호?
Noah_Davids.CAC는 13-04-21 08:15:01 mst에서 %phx_vos#m16에 로그인했습니다.
[f[J[J[?7l[20l=[1m[1;24r[j[J[24;80f[0;1m준비 08:15:01][0;1m
【 0mset_terminal_parameters -terminal_type ascii -pause_lines 0
【 1mset_terminal_parameters -terminal_type ascii-pause_lines 0

준비 완료 08:15:01
foo.cm
display_system_usage
모듈 %phx_vos #m16, G94330, OpenVOS 릴리스 17.1.0ax용 사용 통계
모두 762.6 시간 (31.7 일) 최대.
----CPU----- 마지막 분 마지막 5 분 마지막 시간 모든 최대 시간
. . . . .
Int. Time 0.00 0.1% 0.02 0.1% 0.23 0.1% 191.65 0.1%
넷스타트 -통계
Tcp:
. . . . 
       201766 tcpOutRsts

analyze_system -request_line stcp_meters -모두 -long-quit
오픈보스 출시 17.1.0ax, analyze_system 릴리스 17.1.0ax
현재 공정은 884, ptep 8D3E6000, Noah_Davids.CAC

stcp_meters %phx_vos#m16 762:36:19 13-04-21 08:15:02
 . . . .
   bufdat 실행 678 (평균 0.0002/초)

준비 완료 08:15:02
준비 완료 08:15:03

그림 5 – send_cmds 실행

 

기대:

gnu_library 기대라는 프로그램이 있습니다. 예상 스크립트의 구문은 매우 복잡할 수 있으며, 서로 다른 반환 문자열을 기반으로 분기를 허용하므로 타이밍 아웃 대신 지능적으로 오류를 처리할 수 있습니다. 예를 들어 웹을 체크 아웃하여 "스크립트 예제 예상"을 검색하기만 하면 됩니다. 난 그냥 로그인하고 foo.cm 매크로를 실행하는 간단한 스크립트를 발표 할 것이다. gnu_tools 초기 버전에서 몇 가지 버그가 있었다 (내가 send_cmds 쓴 이유입니다) 하지만 릴리스3.4.0a로 당신은 확인되어야한다. 표시되지는 않지만 암호가 스크립트의 일부가 될 필요가 없거나 스크립트가 암호를 묻는 메시지가 표시 될 수 있도록 인수를 사용할 수도 있습니다. 다시 스크립트에서 명령 출력을 잘렸고 터미널 유형을 ascii로 설정할 때까지 문자 위치 지정 문자열의 비제어 문자가 표시되는 것을 볼 수 있습니다. 그러나 문자열을 다르게 필터링하므로 모든 문자가 표시되지 않을 것으로 예상합니다.

"텔넷" 생성                                                                
"텔넷>을 기대합니다.
보내기 "192.168.77.128r 열기"
"로그인" 기대
"로그인 ndr" 보내기
"암호"를 기대합니다.
"암호기" 보내기
"준비"를 기대합니다.
"set_terminal_parameters-terminal_type ascii-pause_lines 0r" 보내기
"준비"를 기대합니다.
"foo.cmr" 보내기
"준비"를 기대합니다.

그림 6 - 스크립트가 로그인하여 foo 명령 매크로를 실행할 것으로 예상

>빈>은 테스트를 기대합니다.예상
스폰 텔넷
텔넷> 192.168.77.128 오픈
노력...
192.168.77.128에 연결됩니다.
탈출 문자는 '^]'입니다.

피닉스 CAC VOS 테스트 시스템 (%phx_vos#m16)

다른 VOS 릴리스에서 부팅하려면 ***
   >감독관>커먼>cfg>reconfig_instructions ***

오픈보스 출시 17.1.0ax, 모듈 %phx_vos#m16
로그인 하시기 바랍니다 08:51:28
로그인 nd
암호?

Noah_Davids.CAC는 13-04-21 08:51:28 mst에서 %phx_vos#m16에 로그인했습니다.
fJ?7l20l
0;1m준비 08:51:28
set_terminal_parameters-terminal_type -pause_lines 0
준비 완료 08:51:28
foo.cm
display_system_usage
모듈 %phx_vos #m16, G94330, OpenVOS 릴리스 17.1.0ax용 사용 통계
전체 763.2 시간 (31.8 일) 최대.

----CPU----- 마지막 분 마지막 5 분 마지막 시간 모든 최대 시간
. . . .
Int. Time 0.00 0.1% 0.02 0.1% 0.24 0.1% 191.80 0.1%
넷스타트 -통계
Tcp:
. . . .
       201926 tcpOutRsts

analyze_system -request_line stcp_meters -모두 -long-quit
오픈보스 출시 17.1.0ax, analyze_system 릴리스 17.1.0ax
현재 공정은 895, ptep 8D2E1200, Noah_Davids.CAC

stcp_meters %phx_vos#m16 763:12:46 13-04-21 08:51:29
. . . .
   bufdat 실행 678 (평균 0.0002/초)

준비 완료 08:51:29
준비 완료 08:51:29

그림 7 – 스크립트 실행 기대

 

SSH:

마지막으로 SSH를 사용하여 원격 시스템에서 명령을 실행할 수 있습니다. 공개 키 인증도 설정한 경우 실행 시 암호에 대한 메시지가 표시되지 않습니다.

SSH를 사용할 때 흥미로운 주름의 숫자가 있다. 첫 번째 약어는 작동하지 않습니다, dPs를 실행하려고하지 마십시오, display_print_status 사용합니다.

ssh nd@192.168.77.128 dbs                                                     
sh : dbs : 명령을 찾을 수 없습니다
준비 12:26:25

그림 8 - SSH를 사용하여 명령 약어를 원격으로 실행해도 작동하지 않습니다.

ssh nd@192.168.77.128 display_batch_status                                    

%phx_vos#m16에 대한 일괄 처리 큐

큐 상태 최대 실행 작업
일반 실행 5
준비 됨 12:26:43

그림 9 - SSH를 사용하여 명령을 원격으로 실행합니다.

 

둘째, 명령 매크로를 직접 실행하는 것은 작동하지 않습니다. 출력이 없으며 매크로의 첫 번째 명령만 처리된 것으로 보입니다.

ssh nd@192.168.77.128 'foo.cm'                                                
display_system_usage
준비 12:08:40

그림 10 - SSH를 사용하여 명령 매크로를 원격으로 실행해도 항상 작동하지 는 않습니다.

 

대신 셸 명령을 실행하고 명령 매크로를 인수로 제공해야 합니다.

ssh nd@192.168.77.128 '/빈/sh foo.cm'
display_system_usage
모듈 %phx_vos #m16, G94330, OpenVOS 릴리스 17.1.0ax용 사용 통계
전체 766.5시간(31.9일) 증가.

----CPU----- 마지막 분 마지막 5 분 마지막 시간 모든 최대 시간
CPU 분 0.02 0.5% 0.09 0.4% 0.91 0.4% 724.76 0.4%
. . . .
Int. Time 0.00 0.1% 0.02 0.1% 0.23 0.1% 192.57 0.1%
넷스타트 -통계
Tcp:
. . . .
       202796 tcpOutRsts

analyze_system -request_line stcp_meters -모두 -long-quit
오픈보스 출시 17.1.0ax, analyze_system 릴리스 17.1.0ax
현재 공정은 922, ptep 8D3C2780, Noah_Davids.CAC

stcp_meters %phx_vos#m16 766:30:14 13-04-21 12:08:57
. . . .
   bufdat 실행 678 (평균 0.0002/초)

준비 12:08:59

그림 11 - SSH를 사용하여 셸 스크립트로 실행하여 명령 매크로를 원격으로 실행합니다.

 

복잡한 매크로가 작동하지 않습니다. 예를 들어 명령 매크로의 각 줄은 별도의 프로세스로 포크되므로 process_dir 사용하여 중간 결과를 보유하는 매크로가 작동하지 않습니다. 각 analyze_system 호출은 다른 프로세스 번호를 보고하고 있습니다.

ssh nd@192.168.77.128 '/빈/sh foo3.cm'                                       

%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm 13-04-21 12:52:20 mst

디스플레이 foo3.cm
display_line
analyze_system -request_line '' 종료
analyze_system -request_line '' 종료
analyze_system -request_line '' 종료

오픈보스 출시 17.1.0ax, analyze_system 릴리스 17.1.0ax
현재 공정은 1028,ptep 8D3C3000, Noah_Davids.CAC
오픈보스 출시 17.1.0ax, analyze_system 릴리스 17.1.0ax
현재 공정은 1029,ptep 8D3C3000, Noah_Davids.CAC
오픈보스 출시 17.1.0ax, analyze_system 릴리스 17.1.0ax
현재 공정은 1030,ptep 8D3C3000, Noah_Davids.CAC
준비 12:52:21

그림 12 - 매크로의 각 명령은 별도의 프로세스로 갈라져 있습니다.

 

VOS 스타일 변수가 있는 명령 매크로를 사용하면 셸이 무엇인지 모르기 때문에 구문 오류가 발생합니다. foo3.cm 명령 매크로는 자체적으로 표시한 다음 9로 계산됩니다. 디스플레이 명령이 실행되고 "&set"이 구문 오류를 생성합니다.

ssh nd@192.168.77.128 '/bin/sh foo3.cm'                                       

%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm  13-04-22 07:33:18 mst

display foo3.cm
&set COUNT 1
&label again
display_line &COUNT&
&set COUNT (calc &COUNT& + 1)
&if &COUNT& < 10 &then &goto again

foo3.cm: line 2: syntax error near unexpected token `&s'
foo3.cm: line 2: `&set COUNT 1'
ready  07:33:18

그림 13 - VOS 스타일 변수가 있는 명령 매크로가 작동하지 않습니다.

 

그러나 쉘 변수를 사용하면 작동합니다. 물론 기존 매크로를 광범위하게 다시 작성해야 할 수도 있습니다. 다음은 셸 스크립트와 동일한 매크로의 예입니다.

ssh nd@192.168.77.128 '/빈/sh foo3u'                                         
고양이 푸3u
카운트=1
[[ $count -le 9]]
할 수 있습니다
    에코 "$count"
    ((카운트++)
수행
1
2
3
4
5
6
7
8
9
준비 완료 07:44:41

그림 14 – 쉘 stype 변수가 있는 쉘 스크립트가 작동합니다.

 

그러나 VOS 스타일 명령 매크로를 시작 프로세스로 실행한 다음 생성된 아웃파일을 표시할 수 있습니다. 매크로 start_foo3.cm는 start_process 실행하고 프로세스가 종료될 때까지 기다린 다음 헤더없이 출력 파일을 표시합니다. 명령 및 매크로 라인을 끄기 위해 foo3.cm 수정했으며 대화형으로 실행되는 명령 매크로에서 출력을 더 완벽하게 모방할 수 있는 준비 된 프롬프트를 수정했습니다.

start_process foo3.cm -대기                                                   
디스플레이 foo3.out -no_header

그림 15 – 시작 된 프로세스로 foo3.cm 실행 하는 명령 매크로

 

로그인 헤더와 처음 2줄의 명령 매크로 이름과 끝에 있는 "프로세스 완료" 줄을 제외하고 결과는 VOS 명령줄에서 매크로를 실행한 것과 동일합니다.

ssh nd@192.168.77.128 '/bin/sh start_foo3.cm'                                 
Noah_Davids.CAC logged in on %phx_vos#m16 at 13-04-22 10:45:23 mst.
foo3.cm

%phx_vos#m16_mas>SysAdmin>Noah_Davids>foo3.cm  13-04-22 10:45:23 mst

&echo no_input_lines no_command_lines no_macro_lines
set_ready -format off
display foo3.cm
&set COUNT 1
&label again
display_line &COUNT&
&set COUNT (calc &COUNT& + 1)
&if &COUNT& < 10 &then &goto again

1
2
3
4        
5
6
7
8
9
Process finished.
ready  10:45:25

그림 16 – 시작된 프로세스에서 foo.cm 실행 결과

 

따라서 자동 로그인 및 명령을 실행하는 다른 방법인 텔넷을 사용할 수 없는 동안 볼 수 있습니다.