2011-03-17 3 views
1

나는 C#에서 plink를 사용하여 Linux 서버에 연결하고 일부 프로그램을 실행합니다. C# console 프로그램과 plink.exe는 모두 동일한 Windows 시스템에 있습니다.C#에서 plink의 캐시 키 질문에 yes로 응답하는 방법

문제는 리눅스 서버에 처음 연결할 때 plink가 Linux 서버에서 SSH 키를 수락하고 저장할지 묻습니다. 모든 서버가 LAN에 있고 보안 상 문제가 없기 때문에 항상 예라고 응답하고 싶습니다.

나는 C# 프로세스 유형을 사용하고 있으며 올바른 인수를 plink에 전달하고 출력을 리디렉션하고 시작합니다. 이제 plink가 프롬프트 할 때 문제가 발생합니다. process.StandardOutput.ReadToEnd(); 멈추고 plink가 키를 받아들이거나 실제로 리눅스 서버에 로그인했는지 여부를 알아낼 방법이 없습니다.

 string output = string.Empty; 
     string error = string.Empty; 
     string arguments = @" -ssh -pw password [email protected] ./Install_xxx.bin"; 

     using (Process process = new Process()) 
     { 
      ProcessStartInfo psi = new ProcessStartInfo(); 
      psi.FileName = "plink"; 
      psi.Arguments = arguments; 
      psi.ErrorDialog = false; 
      psi.UseShellExecute = false; 
      psi.RedirectStandardError = true; 
      psi.RedirectStandardInput = true; 
      psi.RedirectStandardOutput = true; 
      psi.CreateNoWindow = true; 

      process.StartInfo = psi; 
      process.Start(); 

      output = process.StandardOutput.ReadToEnd(); 
      error = process.StandardError.ReadToEnd(); 
     } 

감사

답변

1

귀하의 교착 상태 문제는 Process docu에 설명되어 있습니다. 프로세스가 입력을 기다리면 stdin을 닫을 수 없으므로 블록됩니다. 프로세스가 여전히 stdin : Deadlock으로부터 사용자의 입력을 기다리고 있기 때문에 StandardOutput은 닫히지 않습니다. 비동기 API를 사용하여 한 줄씩 읽을 수도 있고 다른 한 줄에 다른 스레드를 사용할 수도 있습니다.

+0

감사합니다 ... 비동기 메서드를 사용하기로 결정했습니다. – danze

0

대신하여 SSH 연결을 위해 외부 실행 파일을 사용하는 이유가 아닌 SSH 라이브러리를 사용하고 (더 안정적) 코드를합니까?

sharpSsh (most recent version here)은 BSD 사용이 허가 된 Java 라이브러리 인 Jsch의 C# 포트입니다. 나는 그것을 C# 프로젝트에서 매우 성공적으로 사용했다. 키 협상을 포함하여 SSH 연결의 모든 측면을 프로그래밍 방식으로 처리 할 수 ​​있습니다.

0

PLINK를 통해 원격 서버에 원활하게 연결하려면 처음 및 이후 시간에 수동으로 SSH 키를 조정해야합니다. 즉, PUTTYGEN을 사용하여 PLINK에서 사용할 .ppk 개인 키 파일을 만들고 해당 공개 키를 미리 서버의 ~/.ssh/authorized_keys 파일에 저장합니다.

또한 실행하십시오 SSHD의 호스트 키를 조정, 그래서 /etc/ssh에서 개인 키 파일 ssh_host_rsa_key의 세트 ssh_host_dsa_key (수출 키하는 형식을 알아 내기 위해 기존 파일을보고)를 생성하는 puttygen을을 사용하고, 필요

ssh-keygen -y -f /etc/ssh/ssh_host_rsa_key > /etc/ssh/ssh_host_rsa_key.pub을 사용하여 해당 공개 키 파일을 만듭니다 (동일하게 ssh_host_dsa_key.pub 파일을 만듭니다).

PLINK 할 서버가 두 개 이상 있고 모든 키에 연결하는 데 신경 쓰지 않는다면 (로컬 IT 보안 정책에 따라 다름) 동일한 키를 복사하십시오 파일을 각 서버에로드합니다.

THEN, PLINK를 사용중인 Windows 컴퓨터에서 PUTTY 또는 PLINK를 사용하는 서버에 수동으로 연결하고 대화식으로 호스트 키를 받아들입니다. 일단 그렇게하면 PUTTY/PLINK는 해당 키를 Windows 레지스트리에 HKCU\Software\SimonTatham\PuTTY\SshHostKeys 아래에 저장합니다. [email protected]:host과 같은 항목이 표시됩니다. 여기서 host은 서버의 호스트 이름입니다.

이제, 절차의 핵심을 위해, 당신은 당신이 수동으로 [email protected]:host 같은를 사용하는 다른 모든 서버에 대해이 값을 쓸 Microsoft.Win32.RegistryKey 클래스를 사용해야합니다 당신의 C#을 앱에 REG_SZ 16 진수 값 0x23,...을 복사해야 PLINK (당신이이 레지스트리 값을 보안에 민감하다고 생각 하느냐 여부는 당신에게 달려있다. 그래서 당신이해야한다면 C# 응용 프로그램에서 어떻게 든 보호 할 수있다).

다른 사람들이 언급 한 것처럼 SSH 라이브러리를 사용하여 연결 프로세스에 대한 프로그래밍 방식 피드백을 얻는 것이 좋습니다. 그러나 PLINK를 사용하려면이 작업을 수행해야합니다.

관련 문제