2010-05-25 3 views
6

리눅스 콘솔에서 직접 실행하는 경우 다르게 작동해야하는 응용 프로그램이 있습니다. 따라서 사용자가 SSH와 연결하여 FooBar를 실행하거나 사용자가 콘솔로 직접 가서 FooBar를 실행하기 위해 로그인하면 다른 작업을 수행하기를 원합니다.리눅스 콘솔에서 ssh 세션을 실행하고 있는지 확인하는 방법은 무엇입니까?

이 두 시나리오의 차이점을 알기 위해 어떤 C API를 호출해야합니까? 나는 "tty/pts"정보 (예 : "ps axf"를 실행할 때 표시되는 정보)를 봐야한다고 생각했지만, 이것이 최선의 해결책인지 또는 어떤 API를 호출해야하는지 확실하지 않습니다. 그 정보를 얻으려면.

감사합니다. :)

+0

SSH를 통해 연결하는 것보다 tty가 아닌 세션을 가져 오는 다른 방법이 있습니다. 예를 들어, 지금은 바탕 화면에서 KDE 내에서 Konsole을 사용하고 있습니다 ... 저는 실제로 컴퓨터를 사용하지만'누가 '를 실행하면 pty로 표시됩니다. 이것은 귀하의 목적을위한 콘솔 또는 "ssh"세션으로 간주됩니까? 질문을 더 명확하게 편집해야합니다. – rmeador

+0

두 가지 다른 것에 대해 묻고 있다고 생각합니다 ... 실제 질문은 로컬 X 터미널에서 실행 중인지 또는 ssh 세션을 통해 실행 중인지 알 수있는 방법 인 것 같습니다. "리눅스 콘솔"은 일반적으로 [Ctrl +] Alt + F2 등으로 액세스하는 하드웨어 콘솔을 의미합니다. $ TERM == "linux"이면 나중에 나타납니다. –

답변

5

stdin에 대한 ttyname (3)의 리턴 값을 확인하면 프로세스 입력을 제공하는 터미널의 이름을 제공해야합니다.

프로그램이 콘솔에서 실행 중이고 리다이렉트되지 않은 경우/dev/console이됩니다. stdout이/dev/console에 연결되어 있는지 확인할 수 있습니다 - 사용 시나리오에 더 적합한 것을보십시오.

+5

/dev/console은 아니고/dev/tty [0-9]이고 ssh와 gnome-terminal 세션/dev/pts/[0-9] +와 같은 이름으로 나타납니다. isatty()와 결합하여, ttyname()을 사용하는 힌트는 내가해야 할 일에 훌륭하게 작용한다. –

6

스푸핑 걱정되는 정도에 따라 쉽게 확인할 수 있습니다.이 경우 SSH_CLIENT 및 SSH_CONNECTION 환경 변수가 있는지 여부 만 확인하면됩니다 (이 경우 getenv 기능을 원할 것입니다).

3

나는 환경 변수를 상황에 대한 합리적인 표시로보고 싶습니다. C API가 무엇인지 알고 싶지는 않지만 확실합니다.

예를 들어 SSH_CLIENT 또는 SSH_CONNECTION 환경 변수는 사용중인 SSH 클라이언트에 관계없이 내 시스템에 설정됩니다.

시스템에서 실행중인 SSH 서버를 기반으로하는 범용 서버를 확인하는 것이 좋습니다.

+0

젠장, developmentalinsanity가 나를 이겼다;) 너무 오래 쓰지 말았어야했는데 ... – Darien

4

ttyname은 주어진 파일 설명자에 연결된 터미널의 이름을 알려줍니다. 예를 들어 ttyname(0)은 표준 입력 장치를 알려줍니다.

입력 또는 출력이 리디렉션되는 경우 물론 실패합니다. 이 없다면

, 당신은 다양한 환경 변수 (SSH_CONNECTION, SSH_CLIENT, REMOTEHOST, DISPLAY, SESSIONNAME)를 확인할 수 있습니다. Wireshark은 원격으로 실행 중인지 여부를 감지하여 생성되는 네트워크 트래픽을 캡처하지 못하도록합니다. 이를 구현하기 위해 get_conn_cfilter 함수가 사용하는 논리에 관심이있을 수 있습니다.

+1

wireshark 근원에있는 좋은 캐치! – ivans

관련 문제