ssh foo@bar
색상 형식을 제외하고 SSH 세션을 만드는 방법은 무엇입니까 ? 유일한 요구 사항은 설정이 ssh
명령에서 선언되어야 하며 구성 파일에서 설정할 수 없다는 것입니다.
그런데 그 이유는 SSH 셸 결과를 Scala 프로그램으로 가져오고 싶기 때문입니다.관심이 있으시면 git repos에서 자세한 내용을 확인하세요.. 따라서 [03m
예를 들어 색상 코드(및 다른 색상 코드)를 제거해야 합니다. 원격 호스트가 일부 설정을 수행하고 색상이 없을 것이라고 기대할 수 없습니다.
고쳐 쓰다
SSH 라이브러리 와 관련하여
JSch
설명해야 할 몇 가지 설정이 있습니다.setPtyType("dumb")
,dumb
시뮬레이션된 터미널 세션의 매개변수 설정은 다음과 유사합니다. 에뮬레이트된 터미널 결과에는 색상 코드가 포함되지 않습니다. 이 속성을 설정한 후 인쇄를 사용합니다.dumb
Linux
VT100
dumb
echo $TERM
dumb
setPty(bool enable)
기본값은 yesfalse
이지만 명시적으로 설정하면setPty(false)
결과가 깨집니다. 불행하게도 런타임에 pty 값을 가져오는 API를 찾지 못했고, Java용 사실상 표준 SSH 라이브러리임에도 불구하고 라이브러리에 문서가 부족합니다.
SSH 내에서 SSH를 사용하려는 이유는 무엇입니까?
- 일부 중요한 파일이 원격 호스트에 있을 수 있으므로 이 기능이 필요합니다. 따라서 먼저 원격 호스트에 로그인한 다음 다른 호스트에 로그인해야 합니다.
- 터미널에 로그인하고 SSH를 사용하여 다른 호스트에 연결하는 것은 정상 작동입니다.
Scala 라이브러리에 색상 코드가 있는 경우 출력은 무엇입니까?
속도:JSch
SSH 세션 연결을 생성하는 데 사용됩니다 .- 사용
ls
- 새 하우징에 연결
cd /var
새 케이스에 사용ls
새 케이스에 사용하세요.
//use `JSch` create a ssh session connection.
val shell = new Shell(Auth("hostname", "username", 22, "pwd"))
//use `ls`
shell.exc("ls")
//connect to new shell
val newShell = shell.newShell(Auth("xxx.xxx.xxx.xxx", "root", 22, "pwd")).right.get
//use `cd /var` on the new shell
newShell.exc("cd /var")
//use `ls` on the new shell.
newShell.exc("ls")
newShell.exit()
shell.disconnect()
속성을 shell.exc("ls")
사용하고 있기 때문에 명령이 완벽하게 출력됩니다 . 색상 코드를 인쇄하지 않습니다. dumb
JSch.setPtyType()
색상 코드에 문제가 발생하여 newShell.exc("ls")
다음과 같이 인쇄됩니다.
[0m[01;34mbackups[0m [01;34mcache[0m [01;34mlib[0m [01;34mlocal[0m [01;36mlock[0m [01;34mlog[0m [01;34mmail[0m [01;34mopt[0m [01;36mrun[0m [01;34mspool[0m [30;42mtmp[0m
분명히 여기에는 일부 색상 코드가 포함되어 있습니다. val newShell
베어 명령에 의해 생성되므로 같은 방식이 아닙니다 ssh -t -o StrictHostKeyChecking=no foo@bar
.JSch
지금은 색상 코드를 처리하고 응답 정보를 텍스트로만 유지하려고 합니다.
backups cache lib local lock log mail opt run spool tmp
문제가 명확해지기를 바랍니다. 다시 한 번 감사드립니다.
다시 업데이트
내 두 가지 실수에 대해 죄송합니다.
TERM=dumb
JSch
설정을 사용하면dumb
새 SSH가 이를 속이기 때문에 전혀 필요하지 않습니다 .setPty(true)
(또는 -T 매개변수)이 영향을 받고 테스트가 실패합니다. 또 다른 문제는MAGIC_SPLIT
상수가 이 모드\n
가 아닌 해당 모드에서 시작/종료되어야 한다는 것입니다\r\n
.
어떤 변경을 해야 합니까?
더 깔끔한 응답이므로 -T 매개변수를 포함하고 사용 하는 setPty(true)
모든 메시지 프로토콜 에 사용됩니다 .JSch
ssh
dumb
어떤 질문이 남았나요?
일부 원격 호스트는 stdin: is not a tty
로그인에 성공한 후 오류 메시지로 응답합니다. 원격 호스트가 echo $?
실패하기 때문입니다. 그러나 이것은 이미 요점을 벗어났습니다.
이 주제에 대해
질문으로 돌아가서 how to use ssh session with no color formatting?
대답은 -T
에 매개변수를 사용하는 것입니다 ssh
.
마지막으로 @sourcejedi의 인내심에 큰 감사를 드립니다.
답변1
그냥 해.
출력이 다른 프로그램으로 파이프되는 로컬 프로그램은 터미널에 연결되어 있지 않음을 감지해야 하므로 색상 코드를 사용할 수 없습니다(색상 코드는 터미널마다 다르므로 TERM 환경 변수가 필요함).
로컬 프로그램이 ssh
다른 프로그램으로 파이프되고 options 를 전달하지 않으면 -tt
"의사 터미널" 할당을 억제하고 대신 파이프를 사용합니다. 당신은 또한 볼 수 있습니다 man ssh
.
코드가 출력을 캡처하기 위해 파이프를 사용하는 대신 "의사 터미널"을 할당하는 경우회의이 사실을 주목해야 합니다. 대부분의 경우 필요한 코드는 파이프를 사용하는 것보다 더 모호하고 길며, 대부분의 경우 PTY의 추가 기능이 필요하지 않습니다.
귀하의 질문이 잘못되었다고 생각하지 않는 한 (업데이트 섹션에서)
실제로 실행하고 있지 않다고 가정 ssh
하지만 대신 sshpass -p '${auth.password}' ssh
...
해당 페이지에 따르면 sshpass는 man
"전용 TTY에서 ssh를 실행하여 대화형 사용자로부터 비밀번호를 얻는다고 생각하도록 속입니다"(예, 또 다른 PTY입니다).
이 경우 내부 SSH 연결에 대한 일반적인 터미널 동작을 다시 비활성화해야 합니다. 그것은 ssh -T
( ssh -t
코드 커밋 중 하나와는 달리!)을 사용하고 있습니다.
나는 접두사 with가 TERM=dumb
매우 유사한 효과를 얻을 수 있다고 생각합니다. 해결 방법은 다음과 같습니다. ssh -T
TERM을 망칠 필요가 없습니다. 하지만 TERM=dumb sshpass sh -c 'echo $TERM'
내 컴퓨터에서 테스트해 본 결과 합격한 것 같습니다. 어쩌면 더 간단하다고 생각할 수도 있습니다.
다음 질문: 테스트에서 코드가 필요할 때 이것이 필요하다고 말하는 이유는 무엇입니까?반품TERM=dumb
(내부) 명령을 시작하기 전에 이미 설정을 시작했습니까 ssh
? 당신은 그들이 ssh
그것을 물려받았을 것이라고 기대할 것입니다 TERM=dumb
. Jsch의 코드를 확인하세요. setPtyType("dumb")
전화도 안 받으시니까 별 영향 없을 것 같아요 setPty(true)
.
내 이해는 "깨짐"에 대한 귀하의 주장과 모순되지만 setPty(false)
귀하는 방법을 말하지 않았습니다.