scp - sudo: no tty present and no askpass program specified
예전에 만들어 둔 scp 제어 프로그램을 보면,
pscp.exe 기능을 C#으로 제어하는 방법
; https://www.sysnet.pe.kr/2/0/11849
session.ExecuteCommand라는 기능을 통해 원격지 리눅스 머신에 명령어를 수행하는 것이 가능합니다. 그런데 간혹 sudo 권한으로 명령을 실행하고 싶을 수가 있는데, 그럴 때 해당 프로그램을 다음과 같은 식으로 실행하면,
string cmd = "sudo /usr/bin/dotnet";
session.ExecuteCommand(cmd);
원격지에서는 암호를 다시 입력받는 과정을 거치느라 잠시 후 오류가 발생합니다.
sudo: no tty present and no askpass program specified
Error: WinSCP.SessionRemoteException: Command 'sudo /usr/bin/dotnet'
failed with return code 1 and error message
sudo: no tty present and no askpass program specified.
at WinSCP.OperationResultBase.Check()
at Example.DoRunCommand(Session session, CommandArg arg, String password) in D:\dpapiscp\Program.cs:line 96
at Example.Main(String[] args) in D:\dpapiscp\Program.cs:line 64
따라서 이 암호를 입력받는 것을 자동화해야 하는데요. 이를 위해 sudo 명령의 -S 옵션을 이용하면 됩니다. 그래서 다음과 같이 입력을 redirection 받을 수 있습니다.
string cmd = "echo pwct | sudo -S /usr/bin/dotnet"; // 암호가 pwct라고 가정
session.ExecuteCommand(cmd);
참고로, 원격에서 수행할 명령을 cmd.exe 창의 명령행을 통해 다음과 같이 전달하고 싶을 수 있습니다.
C:\temp> dpapiscp.exe echo pwct | sudo -S /usr/bin/dotnet
그런데, 위와 같이 입력하면 "|" 기호도 윈도우 shell은 파이프라인 기호로 인식하기 때문에 sudo를 명령어로 해석하게 되어 다음과 같은 오류가 발생합니다.
'sudo' is not recognized as an internal or external command, operable program or batch file.
따라서 이런 경우에는 인용 마크를 함께 써서 해결해야 합니다.
C:\temp> dpapiscp.exe "echo pwct | sudo -S /usr/bin/dotnet"
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]