it-swarm-ko.tech

SSH를 사용하는 것처럼 간단하게 직렬 포트에 연결하는 방법은 무엇입니까?

SSH에서와 마찬가지로 직렬 터미널에 연결하는 방법이 있습니까? Minicom과 같은 도구보다 간단한 방법이 있어야합니다.

$ serial /dev/ttyS0 

cat의 결과를 /dev/ttyS0 그러나 포트에서 콘솔까지는 단방향 통신 만 가능합니다. 그리고 포트에 대한 echo는 동일하지만 포트와는 반대입니다.

유닉스/리눅스에서 가능한 가장 간단한 방법으로 시리얼 포트와 양방향 통신을 어떻게 실현할 수 있습니까?

95
ihatetoregister

어쨌든 다른 용도로 사용하기 때문에 screen이 직렬 통신에 가장 유용한 프로그램입니다. 보통 screen /dev/ttyS0 <speed> (기기에 따라 기본 설정이 다를 수 있음) 또한 명령 모드로 들어가서 exec !! <run some program that generates output>.

76
Shawn J. Goff

배경

직렬 포트를 통해 통신하기 위해 minicom와 같은 any 프로그램이 필요한 주된 이유는 포트가 set up 전에 있어야하기 때문입니다. 연결을 시작합니다. 제대로 설정되지 않은 경우 catecho 명령은 예상 한대로 수행하지 않습니다. minicom와 같은 프로그램을 실행하면 포트에 minicom가 사용한 설정이 남습니다. 다음과 같이 stty 프로그램을 사용하여 통신 설정을 쿼리 할 수 ​​있습니다.

stty < /dev/ttyS0

제대로했다면; 컴퓨터를 부팅 한 후 minicom,와 같은 다른 프로그램을 실행하기 전에 통신 설정은 기본 설정이됩니다. 이것들은 아마도 당신이 연결하는데 필요한 것과 다를 것입니다. 이 상황에서 cat 또는 echo 명령을 포트로 보내면 가비지가 발생하거나 전혀 작동하지 않습니다.

stty를 사용하여 minicom 다시 after을 실행하면 설정이 프로그램에서 사용중인 것으로 설정되어 있음을 알 수 있습니다.

최소 직렬 통신

기본적으로 직렬 포트를 통한 양방향 통신을 위해서는 두 가지가 필요합니다. 1) 직렬 포트 구성 및 2) 의사 -tty 읽기-쓰기 열기.

내가 아는 가장 기본적인 프로그램은 picocom입니다. setserial 와 같은 도구를 사용하여 포트를 설정 한 다음 셸에서 직접 상호 작용할 수도 있습니다.

50
rozcietrzewiacz

UUCP가 시스템에 설치된 경우 c 명령을 사용할 수 있습니다 (예 :.

 $ cu -l /dev/ttyS0 -s 9600
26
ktf

쉘 스크립트 herecat을 백그라운드 프로세스로 사용하고 while 루프를 사용하여 사용자 입력을 읽고 echo 포트로 내보내는 방법을 찾았습니다. 나는 그것을 더 일반적으로 수정했고 내 목적에 완벽하게 부합했다.

#!/bin/sh

# connect.sh

# Usage:
# $ connect.sh <device> <port speed>
# Example: connect.sh /dev/ttyS0 9600

# Set up device
stty -F $1 $2

# Let cat read the device $1 in the background
cat $1 &

# Capture PID of background process so it is possible to terminate it when done
bgPid=$!

# Read commands from user, send them to device $1
while read cmd
do
   echo "$cmd" 
done > $1

# Terminate background read process
kill $bgPid
26
ihatetoregister

시도 http://tio.github.io

"tio"는 간단한 명령 줄 인터페이스를 특징으로하는 간단한 TTY 터미널 응용 프로그램으로 기본 입력/출력을 위해 TTY 장치에 쉽게 연결할 수 있습니다.

일반적으로 옵션이 없습니다. 예를 들면 다음과 같습니다.

tio /dev/ttyS0

일반적으로 사용되는 옵션에 해당합니다.

tio --baudrate 115200 --databits 8 --flow none --stopbits 1 --parity none /dev/ttyS0

모든 옵션에 대한 완전한 셸 자동 완성 지원이 제공됩니다.

15
Martin

이 스크립트는 다른 답변 을 기반으로하지만 직렬 포트를 통해 모든 것을 보냅니다 (제외 Ctrl+Q), 단일 명령이 아니라 Enter. 이것은 당신이 사용할 수 있습니다 Ctrl+C 또는 Ctrl+Z 원격 호스트에서 aptitude 또는 alsamixer와 같은 대화식 "GUI"프로그램을 사용합니다. 눌러 종료 할 수 있습니다 Ctrl+Q.

#!/bin/bash

if [[ $# -lt 1 ]]; then
    echo "Usage:"
    echo "  femtocom <serial-port> [ <speed> [ <stty-options> ... ] ]"
    echo "  Example: $0 /dev/ttyS0 9600"
    echo "  Press Ctrl+Q to quit"
fi

# Exit when any command fails
set -e

# Save settings of current terminal to restore later
original_settings="$(stty -g)"

# Kill background process and restore terminal when this Shell exits
trap 'set +e; kill "$bgPid"; stty "$original_settings"' EXIT

# Remove serial port from parameter list, so only stty settings remain
port="$1"; shift

# Set up serial port, append all remaining parameters from command line
stty -F "$port" raw -echo "[email protected]"

# Set current terminal to pass through everything except Ctrl+Q
# * "quit undef susp undef" will disable Ctrl+\ and Ctrl+Z handling
# * "isig intr ^Q" will make Ctrl+Q send SIGINT to this script
stty raw -echo isig intr ^Q quit undef susp undef

# Let cat read the serial port to the screen in the background
# Capture PID of background process so it is possible to terminate it
cat "$port" & bgPid=$!

# Redirect all keyboard input to serial port
cat >"$port"
14
Fritz

Linux에서 실행되는 PuTTY 패키지 인 BTW에는 직렬 지원이 포함되어 있습니다.

7
mdpc

발생할 수있는 또 다른 문제는 직렬 포트에 액세스하기 위해 사용자 계정을 "전화 걸기"그룹으로 설정해야 할 수도 있습니다.

Sudo usermod -a -G dialout $USER
5
dfowler7437

PuTTY는 Linux에서 잘 작동하며 특히 직렬 통신에있어 약간의 편의성을 제공합니다. PuTTY 창 자체에서 복사하여 붙여 넣기를 할 수 없다는 단점이 있습니다. Windows 버전은 강조 표시시 클립 보드에 자동 복사하는 것이 좋으며 마우스 오른쪽 버튼을 클릭하여 동작을 붙여 넣습니다 (chrome 및 firefox는 동일한 동작을 가능하게 함) 모두 훌륭한 플러그인이 있지만 Linux에서는 , 아무 사본도 AFAIK를 사랑하지 않습니다.

복사 부족이 문제인 경우 (나를 위해) PuTTY에서 로깅을 켜고 표준 터미널 창을 열고 # tail -f PuTTY.log 및 양방향 텍스트는 표준 copypasta 조치에 사용 가능합니다.

3
gessel

앞에서 언급했듯이 picocom을 사용해 볼 수 있습니다. 최신 릴리스 (2.0)는 더 이상 셸 명령 삽입을 허용하지 않으므로 "터미널 서버"를 설정하는 데 안전하게 사용할 수 있습니다. 보다:

https://github.com/npat-efault/picocom/releases

3
Nick Patavalis

그것은 당신이하고 싶은 것에 달려 있습니다. 터미널에서 대화식으로 셸 또는 응용 프로그램을 실행하고 직렬 회선을 통해 다른 컴퓨터에 연결하고 직렬 포트를 통해 장치와의 통신을 자동화 하시겠습니까?

양방향 통신을 원한다면 터미널에서 사람과 대화식으로 무언가를 원한다고 가정합니다. 직렬 포트에서 getty (1) 세션을 설정하여 직렬 포트를 통해 터미널에서 로그인을 허용하도록 시스템을 구성 할 수 있습니다. getty는 터미널을 설정하고 로그인을 허용하는 도구입니다. . inittab (5) 파일에 항목을 넣어 적절한 직렬 포트에서 respawn 단위로 실행하십시오.

장치에 연결하고 자동 양방향 대화를 시작하려는 경우 expect 가 원하는 것을 얻을 수 있는지 확인할 수 있습니다. stty (1) 를 사용하여 올바른 패리티, 전송 속도 및 기타 관련 설정으로 포트를 구성하십시오.

직렬 포트를 통해 다른 컴퓨터와 대화식으로 통신하려면 터미널 에뮬레이션 소프트웨어가 필요합니다. 이것은 포트를 설정하고 ANSI 또는 다른 터미널 명령 시퀀스를 해석합니다 (ANSI는 직렬 터미널이 지원하는 유일한 표준이 아닙니다). 많은 터미널 에뮬레이터는 Kermit 또는 zmodem과 같은 파일 전송 프로토콜도 지원합니다.

직렬 통신과 터미널 I/O의 입출력은 상당히 복잡합니다. serial howto. 에서 주제에 대해 알고 싶은 것보다 더 많은 것을 읽을 수 있습니다.

왜 아무도 ser2net 을 언급하지 않았는지 궁금합니다.

/etc/ser2net.conf :

3000:telnet:600:/dev/ttyUSB0:115200 8DATABITS NONE 1STOPBIT
3001:telnet:600:/dev/ttyUSB1:115200 8DATABITS NONE 1STOPBIT
3002:telnet:600:/dev/ttyUSB2:115200 8DATABITS NONE 1STOPBIT
3003:telnet:600:/dev/ttyUSB3:115200 8DATABITS NONE 1STOPBIT

다음과 같이 쉽게 직렬 포트에 연결할 수 있습니다.

telnet localhost 3000

또는 원격으로 :

telnet <ip> 3000

또는 라우터에서 포트 전달을 설정하고 인터넷에 노출하여 어디에서나 연결할 수 있습니다 (보안 문제를 건너 뛰고 유연성에 대해 이야기하고 있습니다).

2

여기에 언급되지 않았으므로 socat- https://stackoverflow.com/questions/2899180/how-can-i-use-com-and에 대한 추가 정보 -usb-ports-with-cygwin :

socat `tty`,raw,echo=0 /dev/ttyS15,raw,echo=0,setsid,sane

또는

socat - /dev/ttyS15,raw,echo=0,setsid,sane

(하지만 Windows의 MSYS2에서 실행이 시작되면 중지하는 문제가있었습니다)

2
sdbbs

장치에 올바른 읽기 쓰기 권한이 있어야합니다. 다음과 같이 볼 수 있습니다.

$ls -l /dev/[serial device]

나는 당신이 찾은 스크립트에 의존하고 약간 수정했습니다.

지금까지 사용한 개발 시스템에는 다음이 필요했습니다.

  • 패리티 없음
  • 원 스톱 비트

이 값은 스크립트의 기본 값입니다.

따라서 연결하려면 다음과 같이 간단하게 사용할 수 있습니다.

./connect.sh /dev/[serial device] [baud speed]

예:

$./connect.sh /dev/ttyUSB0 19200

스크립트:

#!/bin/bash

# connect.sh


#Taken from example modified by: ihatetoregister
# On stack exchange, thread:
# http://unix.stackexchange.com/questions/22545/how-to-connect-to-a-serial-port-as-simple-as-using-ssh
# Modified by Rafael Karosuo <[email protected]>
#   - parity enabling and amount of stop bits
#   - no execution without minimum params
#   - exit code for stty
#   - bgPid fix, used $! instead of $? to take the PID of cat proc in background.
#   - exit command to end the program
#   - CR termination and strip of NL added by READ command, in order to make $cmd\r\n format instead of \n$cmd\n


# Usage:
# $./connect.sh <device> <port speed> [# Stop bits] [parity]

# Stop bits 1|2
# Parity even | odd

# If no last two params, then default values stopbits=1, parity=disab

# Example: 
# connect.sh /dev/ttyS0 9600 1 even, this will use 1 stop bit and even parity
# connect.sh /dev/ttyS0 9600, this will take default values for parity and stopbit


#Check if at least port and baud params provided
if [ -z "$1" ] || [ -z "$2" ]; then
    printf "\nusage: ./connect.sh <device> <port speed> [# Stop bits 1|2] [parity even|odd]\n\tNeed to provide at least port and baud speed parameters.\n\texample:connect.sh /dev/ttyS0 9600\n\n"
    exit 1;
else
    case "$3"   in
        2) stopb="cstopb";;
        *) stopb="-cstopb";;
    esac

    if [ "$4" = "even" ]; then
        par="-parodd"
    Elif [ "$4" = "odd" ]; then
        par="parodd"
    else
        par="-parity"
    fi
    printf "\nThen stty -F $1 $2 $stopb $par\n";
fi

# Set up device
stty -F "$1" "$2" "$stopb" "$par" -icrnl

# Check if error ocurred
if [ "$?" -ne 0 ]; then
    printf "\n\nError ocurred, stty exited $?\n\n"
    exit 1;
fi

# Let cat read the device $1 in the background
cat -v "$1" &

# Capture PID of background process so it is possible to terminate it when done
bgPid="$!"

# Read commands from user, send them to device $1
while [ "$cmd" != "exit" ]
do
   read cmd
   echo -e "\x08$cmd\x0D" > "$1" #strip off the \n that read puts and adds \r for windows like LF

done

# Terminate background read process
kill "$bgPid"

PS : 리시버 시스템을 사용하는 라인 피드의 종류를 알아야합니다.이 경우 필자는 LF와 같은 Windows가 필요한 경우 명령을 보내야하는 방법을 결정하므로 필요합니다. 보내다

command\r

다음에 대한 ASCII 값 :

  • LF : 0Ah, 줄 바꿈 "\ n"
  • CR : 0Dh, 캐리지 리턴 "\ r"
  • BS : 08h, 백 스페이스 "<-"
1
Rafael Karosuo

당신은보고 싶어 할 수 있습니다

http://serialconsole.sourceforge.net

Pro : minicom 또는 picocom과 같은 명백한 보안 문제가 없습니다 (사용자에게 쉘 액세스 권한을 부여하는 데 문제가없는 경우 문제 없음). do 원하는 경우 하나가 있습니다. 터미널 서버를 설정하려면 ...)

1
Peter

또 다른 쉬운 옵션은 -X 플래그를 지정하고 PuTTY 또는 gtkterm과 같은 프로그램을 실행하십시오.

그래서:

$ ssh -X <user>@<machine_address>

$ Sudo apt-get install gtkterm (if not installed already)

$ gtkterm

클라이언트 PC에서 그래픽 인터페이스를 시작해야하며 마치 호스트에있는 것처럼 직렬 포트에 액세스 할 수 있습니다.

면책 조항 : 우분투 컴퓨터에서만 이것을 시도했습니다. 그래픽 인터페이스가없는 컴퓨터에서는 작동하지 않을 것이라고 생각합니다.

Ssh 매뉴얼에서 :

-엑스

X11 전달을 활성화합니다. 구성 파일에서 호스트별로 지정할 수도 있습니다. X11 전달은주의해서 활성화해야합니다. 사용자의 X 권한 데이터베이스에 대해 원격 호스트에서 파일 권한을 무시할 수있는 사용자는 전달 된 연결을 통해 로컬 X11 디스플레이에 액세스 할 수 있습니다. 그런 다음 공격자는 키 입력 모니터링과 같은 활동을 수행 할 수 있습니다. 이러한 이유로 X11 전달에는 기본적으로 X11 SECURITY 확장 제한이 적용됩니다. 자세한 내용은 ssh -Y 옵션 및 ssh_config (5)의 ForwardX11Trusted 지시문을 참조하십시오.

-와이

신뢰할 수있는 X11 전달을 활성화합니다. 신뢰할 수있는 X11 전달에는 X11 SECURITY 확장 컨트롤이 적용되지 않습니다.

-Y 보안이 문제인 경우.

0
Grifo