web-dev-qa-db-ja.com

SSHを使用するのと同じくらい簡単にシリアルポートに接続する方法

SSHと同じようにシリアル端末に接続する方法はありますか?このように、Minicomなどのツールよりも簡単な方法があるはずです。

$ serial /dev/ttyS0 

/dev/ttyS0からの出力をcatできることはわかっていますが、ポートからコンソールへの通信は、その方法でのみ可能です。そして、ポートへのechoも同じですが、ポートへの逆です。

Unix/Linuxでシリアルポートとの双方向通信を最も簡単な方法で実現するにはどうすればよいですか?

95
ihatetoregister

とにかく他のものに使用するので、シリアル通信に最も役立つプログラムはscreenです。通常はscreen /dev/ttyS0 <speed>ですが、デバイスによってはデフォルト設定が異なる場合があります。また、コマンドモードに入ってexec !! <run some program that generates output>を実行することで、セッションに何でもパイプすることができます。

76
Shawn J. Goff

バックグラウンド

シリアルポートを介して通信するためにminicomのようなanyプログラムが必要な主な理由は、ポートを設定する必要があることです接続を開始する前。適切に設定されていない場合、catおよびechoコマンドは、期待したとおりに機能しません。 minicomのようなプログラムを実行すると、ポートはminicomが使用した設定のままになることに注意してください。次のようにsttyプログラムを使用して通信設定を照会できます。

stty < /dev/ttyS0

あなたがそれを正しくやったなら、コンピューターを起動した後、minicom,などの他のプログラムを実行する前に、通信設定はデフォルト設定になります。これらはおそらく、接続を確立するために必要なものとは異なります。この状況では、コマンドcatまたはechoをポートに送信すると、ガベージが生成されるか、まったく機能しなくなります。

sttyを使用してminicomを再度実行afterすると、設定はプログラムが使用していたものに設定されていることがわかります。

最小限のシリアル通信

基本的に、シリアルポートを介して双方向通信を行うには、1)シリアルポートの構成、および2)pseudo-tty読み取り/書き込みのオープンの2つが必要です。

これを行うことがわかっている最も基本的なプログラムはpicocomです。 setserial のようなツールを使用してポートを設定し、シェルから直接操作することもできます。

50
rozcietrzewiacz

UUCPがシステムにインストールされている場合は、コマンドcを使用できます。

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

シェルスクリプト here を使用してcatをバックグラウンドプロセスとして使用する方法と、ユーザー入力を読み取り、ポートにechoを出力するwhileループを使用する方法を見つけました。私はそれをより一般的なものに変更し、私の目的に完全に適合しました。

#!/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

このスクリプトは another answer に基づいていますが、シリアルポート経由でeverythingを送信します(ただし、 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 "$@"

# 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

ところで、PuTTYパッケージ(Linux上で動作します)にはシリアルサポートが含まれています。

7
mdpc

発生する可能性のある別の問題は、シリアルポートにアクセスするために、ユーザーアカウントが「dialout」グループに設定する必要がある場合があることです。

Sudo usermod -a -G dialout $USER
5
dfowler7437

PuTTYはLinuxで適切に動作し、特にシリアル通信の場合に便利です。これには、私が直接解決できなかった1つの欠点があります。PuTTYウィンドウ自体からのコピーと貼り付けができません。 Windowsバージョンには、ハイライト時にクリップボードに自動コピー、右クリックして貼り付け動作(およびchromeとFirefoxの両方で同じ動作を有効にする優れたプラグイン)があります)がLinuxにあります、コピー愛のAFAIK。

コピーの欠如が問題である場合(私にとっては)、PuTTYでのロギングをオンにして、標準のターミナルウィンドウを開き、# tail -f PuTTY.logおよび双方向テキストは、標準のcopypastaアクションで使用できます。

3
gessel

前に述べたように、ピココムを試すことができます。また、最新のリリース(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-within-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

プロ:minicomやpicocomのような明らかなセキュリティ問題はありません(ユーザーにシェルアクセスを与える問題がない場合は問題ありませんが、doターミナルサーバーをセットアップする場合は、1つ用意してください...)

1
Peter

別の簡単なオプションは、-Xフラグを使用してSSH経由でマシンにアクセスし、PuTTYやgtktermなどのプログラムを実行することです。

そう:

$ ssh -X <user>@<machine_address>

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

$ gtkterm

クライアントPCのグラフィカルインターフェイスが起動し、そこからホストにいるかのようにシリアルポートにアクセスできます。

免責事項: ubuntuマシンでのみこれを試しました。グラフィックインターフェースのないマシンでは機能しないと思います。

Sshマニュアルから:

-バツ

X11転送を有効にします。これは、構成ファイルでホストごとに指定することもできます。 X11転送は注意して有効にする必要があります。 (ユーザーのX認証データベースの)リモートホストのファイル権限をバイパスできるユーザーは、転送された接続を介してローカルX11ディスプレイにアクセスできます。その後、攻撃者はキーストロークの監視などのアクティビティを実行できる可能性があります。このため、X11転送には、デフォルトでX11 SECURITY拡張制限が適用されます。詳細については、ssh -configオプションのssh -YオプションとForwardX11Trustedディレクティブを参照してください。

-Y

信頼できるX11転送を有効にします。信頼できるX11転送は、X11 SECURITY拡張コントロールの対象ではありません。

したがって、セキュリティが問題になる場合は、-Yを使用してください。

0
Grifo