Bagaimana menghubungkan ke port serial sesederhana menggunakan SSH?

86

Apakah ada cara untuk terhubung ke terminal serial seperti yang Anda lakukan dengan SSH? Pasti ada cara yang lebih sederhana daripada alat seperti Minicom, seperti ini

$ serial /dev/ttyS0 

Saya tahu saya dapat catmengeluarkan dari /dev/ttyS0tetapi hanya komunikasi satu arah yang memungkinkan, dari port ke konsol. Dan echokeluar ke pelabuhan sama saja tetapi sebaliknya, ke pelabuhan.

Bagaimana saya bisa mewujudkan komunikasi dua arah dengan port serial cara termudah yang mungkin di Unix / Linux?

ihatetoregister
sumber
2
Orang-orang hebat menjawab !. Sayangnya tidak ada yang sepenuhnya sesuai dengan tujuan saya ketika bekerja dengan sistem embedded dengan perintah yang terbatas. Namun saya menemukan cara lain menggunakan shell script yang saya tambahkan sebagai salah satu jawaban untuk pertanyaan saya.
ihatetoregister

Jawaban:

69

Saya menemukan screenprogram yang paling berguna untuk komunikasi serial karena saya menggunakannya untuk hal-hal lain. Ini biasanya adil screen /dev/ttyS0 <speed>, meskipun pengaturan default mungkin berbeda untuk perangkat Anda. Ini juga memungkinkan Anda untuk menyalurkan apa saja ke dalam sesi dengan memasuki mode perintah dan melakukan exec !! <run some program that generates output>.

Shawn J. Goff
sumber
3
+1 untuk layar! Juga, lihat: serverfault.com/q/81544/11086
Josh
1
Lihat juga noah.org/wiki/Screen_notes#using_screen_as_a_serial_terminal dan halaman manual stty (1), saya harus menambahkan opsi tambahan (misalnya paritas) agar bisa berfungsi.
Lekensteyn
3
merasa malu saya salah menghubungkan TX / RX: o
Lekensteyn
screenminicom
Mengagumkan
1
@CiroSantilli 刘晓波 死 六四 事件 法轮功 - Layar mungkin tidak lebih sederhana dari Minicom tetapi karena saya sudah menggunakan Layar, bagi saya itu kurang kompleksitas untuk melakukan hal-hal serial saya dengan Layar juga menghilangkan kebutuhan untuk Minicom sepenuhnya.
yeti
48

Latar Belakang

Alasan utama mengapa Anda memerlukan program apa pun seperti minicomberkomunikasi melalui port serial adalah bahwa port tersebut perlu diatur sebelum memulai koneksi. Jika tidak diatur dengan tepat, catdan echoperintah tidak akan melakukan untuk Anda apa yang Anda harapkan. Perhatikan bahwa sekali Anda menjalankan program seperti minicom, port dibiarkan dengan pengaturan yang minicomdigunakan. Anda dapat menanyakan pengaturan komunikasi menggunakan sttyprogram seperti ini:

stty < /dev/ttyS0

Jika Anda melakukannya dengan benar; setelah mem-boot komputer dan sebelum menjalankan program lain seperti minicom,pengaturan komunikasi akan berada di pengaturan default. Ini mungkin berbeda dari apa yang Anda perlukan untuk membuat koneksi Anda. Dalam situasi ini, mengirim perintah catatau echoke pelabuhan akan menghasilkan sampah atau tidak berfungsi sama sekali.

Jalankan sttylagi setelah menggunakan minicom, dan Anda akan melihat pengaturan diatur ke apa yang digunakan program.

Komunikasi serial minimal

Pada dasarnya, dua hal diperlukan untuk memiliki komunikasi dua arah melalui port serial: 1) mengkonfigurasi port serial, dan 2) membuka pseudo-tty read-write.

Program paling dasar yang saya tahu melakukan hal ini adalah picocom. Anda juga dapat menggunakan alat seperti setserialuntuk mengatur port dan kemudian berinteraksi dengannya langsung dari shell.

rozcietrzewiacz
sumber
5
picocomjuga akan memungkinkan Anda terhubung ke port serial tanpa mengkonfigurasi ulang ( --noinit) dan akan membiarkan Anda keluar tanpa mengembalikan konfigurasi port serial ( --noresetatau menggunakan Ctrl-A/ Ctrl-Quntuk keluar picocom). Saya menemukan picocomlebih mudah digunakan daripada minicom. Untuk alasan yang belum saya ketahui, minicom kadang-kadang tidak akan mengirim atau menerima data pada port yang berfungsi beberapa saat sebelumnya atau bahwa picocom tidak memiliki masalah dengan. Ini mungkin beberapa opsi konfigurasi misterius, tetapi apa pun itu saya tidak dapat mengetahuinya (dan perilaku ini telah terjadi pada lebih dari satu mesin).
Michael Burr
+1 untuk picocom! Saya menemukan bahwa saya tidak dapat menulis perintah ke perangkat serial tanpa akhir baris yang benar: Saya perlu menggunakan --omap crcrlf --echoopsi
user2561747
24

Jika UUCP diinstal pada sistem, Anda dapat menggunakan perintah cu , mis

 $ cu -l /dev/ttyS0 -s 9600
ktf
sumber
Gunakan ~^Datau ~.untuk keluar.
iman
24

Saya menemukan cara menggunakan skrip shell di sini yang menempatkan catsebagai proses latar belakang dan loop sementara yang membaca input pengguna dan echokeluar ke port. Saya memodifikasinya menjadi lebih umum dan cocok dengan tujuan saya.

#!/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
ihatetoregister
sumber
1
Juga, saya telah membuat versi yang sedikit dimodifikasi di bawah ini yang juga dapat mengirim Ctrl + C dan Ctrl + Z.
Fritz
@Fritz Nice find! Jadi jika saya melakukan ini dengan benar, proses latar belakang tidak akan pernah mati karena $? sepertinya tidak meluas ke sesuatu yang benar?
ihatetoregister
1
@ atetoregister: Tidak terlalu benar. Proses latar belakang terbunuh, tetapi bukan karena alasan yang mungkin diharapkan. $?memperluas ke kode keluar dari perintah non-latar belakang terakhir (dalam hal ini stty -F $1 $2), sehingga diperluas ke 0 ketika tidak ada kesalahan. Dengan demikian, baris terakhir menjadi kill 0yang pada gilirannya tampaknya membunuh shell saat ini dan semua anak-anaknya (itu berperilaku berbeda dalam shell interaktif saya percaya). Untuk semua detailnya lihat penjelasan berikut: unix.stackexchange.com/questions/67532/…
Fritz
1
Namun, gotcha asli dalam skrip Anda adalah bahwa proses latar belakang hanya dimatikan jika Anda menekan Ctrl + D untuk mengakhiri skrip Anda, karena itu mengakhiri whileloop dengan bersih. Jika Anda membunuhnya dengan Ctrl + C atau dengan killperintah, maka catprosesnya tetap hidup. Untuk memperbaikinya Anda perlu menggunakan trapperintah untuk mengeksekusi kill $bgPidketika shell keluar, seperti yang dilakukan skrip saya di bawah . Jujur, saya bahkan tidak keberatan jika Anda baru saja menambahkan seluruh skrip saya ke posting Anda. Saya mencoba melakukan itu, tetapi hasil editnya ditolak.
Fritz
Bisakah Anda menjelaskan di mana koneksi masuk, karena ini dikomentari dalam jawaban Anda
Chris Halcrow
14

Coba http://tio.github.io

"tio" adalah aplikasi terminal TTY sederhana yang memiliki antarmuka commandline langsung untuk dengan mudah terhubung ke perangkat TTY untuk input / output dasar.

Penggunaan umum adalah tanpa opsi. Sebagai contoh:

tio /dev/ttyS0

Yang sesuai dengan opsi yang umum digunakan:

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

Itu datang dengan dukungan penyelesaian otomatis shell penuh untuk semua opsi.

Martin
sumber
3
Saya menggunakan msys2Windows dan Anda dapat menginstal tiodengan pacman -S tiokarena itu di antara paket yang tersedia secara default. screen,, picocomdll. tidak. Terima kasih!
Kohányi Róbert
12

Script ini didasarkan pada jawaban lain , tetapi mengirimkan semuanya melalui port serial (kecuali Ctrl + Q), bukan hanya satu perintah diikuti oleh Enter. Ini memungkinkan Anda untuk menggunakan Ctrl + C atau Ctrl + Z pada host jarak jauh, dan menggunakan program "GUI" interaktif seperti aptitude atau alsamixer. Itu dapat dihentikan dengan menekan 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"
Fritz
sumber
7

BTW, paket dempul (yang berjalan di Linux) tidak termasuk dukungan serial.

mdpc
sumber
4

Masalah lain yang dapat terjadi adalah bahwa akun pengguna Anda mungkin perlu diatur ke grup "dialout" untuk mengakses port serial.

sudo usermod -a -G dialout $USER
dfowler7437
sumber
3

Putty bekerja dengan baik di Linux dan menawarkan beberapa kenyamanan, terutama untuk komunikasi serial. Ini memiliki satu kelemahan yang belum dapat saya atasi secara langsung: tidak ada salin-tempel dari jendela Putty itu sendiri. Versi windows memiliki auto-copy ke clipboard pada highlight, klik kanan untuk menyisipkan perilaku (dan ada plugins yang sangat baik untuk chrome dan firefox untuk mengaktifkan perilaku yang sama), tetapi di Linux, tidak ada salinan cinta AFAIK.

Jika kurangnya salinan adalah masalah (bagi saya) maka nyalakan masuk dempul dan buka jendela terminal standar dan # tail -f putty.logdan teks dua arah tersedia untuk tindakan standar copypasta.

gessel
sumber
1
Saya menemukan bahwa Putty di Linux tidak menempel "clipboard" (apa yang Anda salin dengan kontrol-C), tetapi itu akan memasukkan "pemilihan utama" (apa yang saat ini Anda pilih dalam beberapa program) dengan mouse tengah. Anda juga dapat memilih karakter di layar Putty untuk menentukan pemilihan utama. Tetapi jika saya ingin teks dari layar Putty untuk ditransfer ke beberapa VM, saya ingin itu menjadi clipboard, jadi saya harus menggunakan program perantara untuk menerima teks dari seleksi utama dan kemudian menyalinnya ke clipboard.
Pria luar angkasa cardiff
3

Seperti yang disebutkan sebelumnya, Anda dapat mencoba picocom. Rilis terbaru (2.0) juga dapat digunakan (dengan aman) untuk mengatur "terminal server" karena tidak lagi mengizinkan injeksi perintah shell. Lihat:

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

Nick Patavalis
sumber
2

Itu tergantung pada apa yang ingin Anda lakukan. Apakah Anda ingin menjalankan shell atau aplikasi secara interaktif dari terminal, terhubung ke komputer lain melalui saluran serial, mengotomatiskan komunikasi dengan perangkat melalui port serial?

Jika Anda ingin komunikasi dua arah maka saya kira Anda menginginkan sesuatu yang interaktif dengan manusia di terminal. Anda dapat mengkonfigurasi sistem untuk mengizinkan login dari terminal melalui port serial dengan mengatur sesi getty (1) pada port serial - getty adalah alat untuk mengatur terminal dan memungkinkan login ke dalamnya. Letakkan entri di file inittab (5) Anda untuk menjalankannya pada port serial yang sesuai respawn.

Jika Anda ingin terhubung ke perangkat dan memulai percakapan dua arah otomatis maka Anda bisa melihat apakah mengharapkan akan mendapatkan apa yang Anda inginkan. Gunakan stty (1) untuk mengkonfigurasi port ke paritas yang tepat, baud rate dan pengaturan lain yang relevan.

Jika Anda ingin berkomunikasi secara interaktif dengan komputer lain melalui port serial maka Anda akan memerlukan perangkat lunak emulasi terminal. Ini cukup banyak - ia mengatur port, menginterpretasikan ANSI atau urutan perintah terminal lainnya (ANSI masih jauh dari menjadi satu-satunya standar yang didukung oleh terminal serial). Banyak emulator terminal juga mendukung protokol transfer file seperti kermit atau zmodem.

Seluk beluk komunikasi serial dan terminal I / O cukup rumit; Anda dapat membaca lebih dari yang ingin Anda ketahui tentang subjek dalam serial howto.

ConcernedOfTunbridgeWells
sumber
1

Anda mungkin ingin melihatnya

http://serialconsole.sourceforge.net

Pro: tidak memiliki masalah keamanan yang jelas seperti minicom atau picocom (jika Anda tidak memiliki masalah memberikan pengguna akses shell, tidak ada masalah, tetapi Anda kemungkinan besar melakukan memiliki satu jika Anda ingin menyiapkan server terminal ... )

Peter
sumber
1

Anda harus memastikan memiliki izin baca tulis yang benar pada perangkat, Anda dapat melihatnya dengan:

$ls -l /dev/[serial device]

Saya mengandalkan skrip yang Anda temukan dan membuat beberapa modifikasi.

Untuk sistem pengembangan yang saya gunakan sekarang, mereka membutuhkan:

  • Tidak ada paritas dan
  • One stop bit

Nilai-nilai itu adalah nilai default dalam skrip.

Jadi untuk terhubung, Anda dapat menggunakannya sesederhana berikut ini:

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

Contoh:

$./connect.sh /dev/ttyUSB0 19200

Naskah:

#!/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: Anda perlu tahu jenis feed line mana yang menggunakan sistem penerima Anda karena ini akan menentukan bagaimana Anda harus mengirim perintah dalam kasus saya, saya memerlukan Windows seperti LF, berarti saya harus mengirim

command\r

Nilai ASCII untuk:

  • LF: 0Ah, umpan baris "\ n"
  • CR: 0Dh, carrige return "\ r"
  • BS: 08j, ruang belakang "<-"
Rafael Karosuo
sumber
1
(1)  #!/bin/shdiabaikan jika bukan baris pertama file. (2) Serius? Anda menggunakan 1untuk menentukan paritas genap dan 2untuk menentukan ganjil ? (3) Ini konvensional untuk memiliki pesan "penggunaan" atau "bantuan" yang mendokumentasikan semua parameter, bukan hanya yang wajib. (4) Anda harus selalu mengutip referensi variabel shell Anda (misalnya, "$1", "$2", "$3", "$4", "$stopb", "$par", "$bgPid", dan bahkan "$?"dan "$!") kecuali Anda memiliki alasan untuk tidak, dan Anda yakin Anda tahu apa yang Anda lakukan.
Scott
1

Saya heran mengapa tidak ada yang menyebut ser2net .

Contoh /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

Anda dapat terhubung ke port serial semudah:

telnet localhost 3000

Atau dari jarak jauh:

telnet <ip> 3000

Atau bahkan mengatur penerusan port pada router Anda dan memaparkannya ke Internet, sehingga Anda dapat menghubungkannya dari mana saja (mari kita lewati masalah keamanan, saya berbicara tentang fleksibilitas).

Andrejs Cainikovs
sumber
0

Opsi mudah lainnya adalah mengakses mesin lebih dari ssh dengan -Xbendera dan menjalankan program seperti dempul atau gtkterm.

Begitu:

$ ssh -X <user>@<machine_address>

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

$ gtkterm

Seharusnya meluncurkan antarmuka grafis pada PC klien Anda dan dari sana Anda dapat mengakses port serial seolah-olah Anda akan menjadi tuan rumah.

Penafian: Hanya mencoba ini dengan mesin ubuntu. Saya menduga itu tidak akan bekerja dengan mesin tanpa antarmuka grafis.

Dari manual ssh:

-X

Mengaktifkan penerusan X11. Ini juga dapat ditentukan berdasarkan per-host dalam file konfigurasi. Penerusan X11 harus diaktifkan dengan hati-hati. Pengguna dengan kemampuan untuk mem-bypass izin file pada host jarak jauh (untuk database otorisasi X pengguna) dapat mengakses tampilan X11 lokal melalui koneksi yang diteruskan. Seorang penyerang kemudian dapat melakukan kegiatan seperti pemantauan keystroke. Karena alasan ini, penerusan X11 dikenakan pembatasan ekstensi X11 SECURITY secara default. Silakan merujuk ke opsi ssh -Y dan arahan ForwardX11Trusted di ssh_config (5) untuk informasi lebih lanjut.

-Y

Mengaktifkan penerusan X11 yang tepercaya. Penerusan X11 tepercaya tidak dikenai kontrol ekstensi X11 SECURITY.

Jadi gunakan -Yjika keamanan merupakan masalah.

Grifo
sumber