SSH kullanmak kadar basit bir seri porta nasıl bağlanılır?


86

SSH ile yaptığınız gibi seri bir terminale bağlanmanın bir yolu var mı? Minicom gibi araçlardan daha basit bir yol olmalı, bunun gibi

$ serial /dev/ttyS0 

catÇıkışı alabildiğimi biliyorum , /dev/ttyS0ancak bağlantı noktasından konsola kadar bu şekilde yalnızca bir yönlü iletişim mümkün. Ve echolimana gidenler aynıdır ama diğer tarafa, limana.

Seri port ile iki yönlü iletişimi Unix / Linux'ta mümkün olan en basit şekilde nasıl gerçekleştirebilirim?


2
Harika insanlar cevaplar! Maalesef hiç kimse, sınırlı bir komut setine sahip gömülü sistemler ile çalışırken amacımı tam olarak karşılayamıyor gibi görünüyor. Ancak sorumun yanıtlarından biri olarak eklediğim bir kabuk komut dosyası kullanarak başka bir yol buldum.
imhatetoregister

Yanıtlar:


69

screenZaten başka şeyler için kullandığım için seri iletişim için en faydalı programı buluyorum . screen /dev/ttyS0 <speed>Varsayılan ayar, cihazınız için farklı olsa da, genellikle sadece bir işlemdir. Ayrıca, komut moduna girerek ve yaparak herhangi bir şeyi oturuma aktarmanızı sağlar exec !! <run some program that generates output>.


3
Ekran için +1! Ayrıca bkz .: serverfault.com/q/81544/11086
Josh

1
Ayrıca bakınız noah.org/wiki/Screen_notes#using_screen_as_a_serial_terminal ve manuel sayfa stty (1), çalışması için fazladan seçenekler (örneğin parite) eklemek zorunda kaldım.
Lekensteyn

3
utanç
duyuyor

screenharika, ama minicom:-) ' den daha basit olduğunu sanmıyorum
Ciro Santilli

1
@CiroSantilli 刘晓波 死 六四 事件 法轮功 - Ekran Minicom'dan daha basit olmayabilir, ancak Ekranı zaten kullandığım için benim için Ekran ile seri işimi yapmak Minicom ihtiyacını tamamen ortadan kaldırarak daha az karmaşık.
yeti

48

Arka fon

İhtiyacınız asıl sebebi herhangi bir program gibi minicombir seri port üzerinden iletişim kurmak için liman olması gerektiğidir kurmak bağlantı başlatmadan önce. Uygun şekilde kurulmamışsa, catve echokomutları sizin için beklediğiniz şeyi yapmaz. Bunun gibi bir programı çalıştırdığınızda minicom, minicomkullanılan ayarlarla bağlantı noktasının bırakıldığına dikkat edin . Aşağıdaki sttygibi programı kullanarak iletişim ayarlarını sorgulayabilirsiniz :

stty < /dev/ttyS0

Doğru yaptıysanız; bilgisayarı açtıktan sonra minicom,ve iletişim ayarları gibi başka bir programı çalıştırmadan önce varsayılan ayarlarında olacaktır. Bunlar muhtemelen bağlantınızı kurmak için ihtiyacınız olandan farklı. Bu durumda, komutları catveya echolimana göndermek ya çöp üretecek ya da hiç çalışmayacak.

Run sttytekrar sonra kullanarak minicomve ayarları programı kullanılarak ne ayarlanır göreceksiniz.

Minimum seri iletişim

Temel olarak, seri port üzerinden iki yönlü iletişim kurmak için iki şeye ihtiyaç vardır: 1) seri portu yapılandırmak ve 2) sözde okuma yazma yazmak.

Bunu bildiğim en temel program picocom. setserialBağlantı noktasını ayarlamak gibi bir araç da kullanabilir ve ardından doğrudan kabuktan onunla etkileşime girebilirsiniz.


5
picocomayrıca, yeniden yapılandırmadan bir seri porta bağlanmanıza izin verecek ( --noinit) ve seri port konfigürasyonunu geri yüklemeden çıkmanıza ( --noresetveya çıkmak için Ctrl-A/ kullanmanıza ) izin verecektir . Kullanmaktan daha kolay olduğunu buldum . Anlayamadığım nedenlerden dolayı, minicom bazen sadece anlar önce çalışan ya da picocom'un sorun çıkarmayacağı bir porttan veri gönderip almayacak. Muhtemelen bazı gizli konfigürasyon seçenekleridir, fakat ne olursa olsun çözemiyorum (ve bu davranış birden fazla makinede gerçekleşti). Ctrl-Qpicocompicocomminicom
Michael Burr

Picocom için +1! Seri cihaza doğru satır sonları olmadan komut yazamadığımı gördüm: --omap crcrlf --echoseçenekleri kullanmam gerekiyor
user2561747

24

UUCP sisteme kurulursa , cu komutunu kullanabilirsiniz , örn.

 $ cu -l /dev/ttyS0 -s 9600

Çıkmak için ~^Dveya ~.düğmesini kullanın .
iman

24

Buradacat arka plan işlemi olarak koyan bir kabuk betiği ve kullanıcı girişini ve echobağlantı noktasını okuyan bir süre döngüsü kullanmanın bir yolunu buldum . Daha genel olması için değiştirdim ve amacımı mükemmel bir şekilde yerine getirdi.

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

1
Ayrıca, aşağıda Ctrl + C ve Ctrl + Z de gönderebilen biraz değiştirilmiş bir sürüm yaptım .
Fritz,

@Fritz Güzel bul! Öyleyse bunu doğru yaparsam, arka plan işlemi asla öldürülmeyecek çünkü $? doğru bir şey genişletmek görünmüyor mu?
imhatetoregister

1
@ihatetoregister: Çok doğru değil. Arka plan süreci öldürülür, ancak beklenebilecek sebeplerden ötürü değildir. $?son arka plan dışı komutun çıkış koduna genişler (bu durumda stty -F $1 $2), bu nedenle hata olmadığında 0'a genişler. Bu nedenle, son satır kill 0mevcut kabuğu ve tüm çocuklarını öldürüyor gibi görünüyor (inanıyorum ki etkileşimli mermilerde farklı davranıyor). Tüm ayrıntılar için aşağıdaki açıklamaya bakın: unix.stackexchange.com/questions/67532/…
Fritz

1
Howerver, betiğinizdeki gerçek sonuç, arka plan işleminin yalnızca betiğinizi sonlandırmak için Ctrl + D tuşlarına basarsanız öldürülmesidir, çünkü bu, whiledöngüyü temiz bir şekilde sonlandırır . Ctrl + C veya killkomutla öldürürseniz , catişlem canlı kalır. Kullanmak ihtiyacı olacağını düzeltmek için trapyürütülecek komutu kill $bgPidgibi, zaman kabuk çıkar benim senaryom aşağı aşağıda yapar . Açıkçası, tüm senaryomu yazıya ekleseydin bile umrumda değil. Bunu yapmaya çalıştım, ancak düzenleme reddedildi.
Fritz

Connect devreye girer bu Cevabınız kodunda iptal edilmiştir gibi, açıklar mısınız
Chris Halcrow

14

Http://tio.github.io adresini deneyin

"tio", temel giriş / çıkış için TTY cihazlarına kolayca bağlanacak basit bir komut satırı arayüzüne sahip basit bir TTY terminal uygulamasıdır.

Tipik kullanım seçeneksizdir. Örneğin:

tio /dev/ttyS0

Yaygın olarak kullanılan seçeneklere karşılık gelir:

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

Tüm seçenekler için tam otomatik kabuk tamamlama desteği ile birlikte gelir.


3
Ben kullanıyorum msys2Windows üzerinde ve yükleyebilirsiniz tioile pacman -S tiovarsayılan olarak paketlerin arasındaki çünkü. screen, picocomvb değildir. Teşekkürler!
Kohányi Róbert

12

Bu komut dosyası başka bir cevabı temel alır , ancak bunu takiben yalnızca tek komutlar yerine seri bağlantı noktasındaki her şeyi (Ctrl + Q hariç) gönderir Enter. Bu, uzak ana bilgisayarda Ctrl + C veya Ctrl + Z'yi kullanmanıza ve yetenek ya da alsamixer gibi etkileşimli "GUI" programlarını kullanmanıza olanak tanır. Ctrl + Q tuşlarına basarak çıkabilirsiniz.

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

7

BTW, macun paketi (Linux üzerinde çalışır) seri destek içerir.


4

Ortaya çıkabilecek başka bir sorun, kullanıcı hesabınızın seri bağlantı noktasına erişmek için "çevirmeli ağ" grubuna ayarlanması gerekebilir.

sudo usermod -a -G dialout $USER

3

Macun Linux üzerinde iyi çalışıyor ve özellikle seri iletişim için bazı kolaylıklar sunuyor. Doğrudan çözemediğim bir dezavantajı var: Putty penceresinden kopyala-yapıştır yok. Windows sürümünde panoya otomatik olarak kopyalanan vurgulama özelliği, yapıştırma davranışı için sağ tıklatma (ve aynı davranışı etkinleştirmek için hem krom hem de firefox için mükemmel eklentiler vardır), ancak Linux'ta AFAIK kopyası yoktur.

Kopyalama eksikliği bir sorunsa (benim için) o zaman macun ile oturum açın ve standart bir terminal penceresi açın ve # tail -f putty.logstandart copypasta eylemi için çift yönlü metin kullanılabilir.


1
Linux altındaki Putty'nin "panoya" yapıştırmadığını (control-C ile kopyaladığınız şeyi) orta fare ile "birincil seçim" i (bazı programlarda seçmiş olduğunuz şeyi) ekleyeceğini biliyorum. Aynı şekilde, birincil seçimi tanımlamak için Macun ekranındaki karakterleri de seçebilirsiniz. Ancak bir Macun ekranından bir metnin bir VM'ye aktarılmasını istiyorsam, panoya ihtiyacım var, bu yüzden ana seçimden metni almak için aracı bir program kullanmalı ve daha sonra panoya kopyalamalıyım.
cardiff uzay adamı


2

Bu ne yapmak istediğinize bağlıdır. Terminalden etkileşimli bir kabuk veya uygulama çalıştırmak, seri hat üzerinden başka bir bilgisayara bağlanmak, seri port üzerinden bir cihazla iletişimi otomatikleştirmek ister misiniz?

İki yönlü iletişim istiyorsanız, terminalde bir insanla etkileşimli bir şey istediğinizi farz ediyorum. Sistemi, seri portta bir getty (1) oturumu ayarlayarak bir terminalden seri port üzerinden oturum açmalara izin verecek şekilde yapılandırabilirsiniz - getty, bir terminal kurmak ve oturum açmak için kullanılan bir araçtır. Temel olarak uygun seri bağlantı noktasında çalıştırmak için inittab (5) dosyanıza bir giriş koyun respawn.

Bir cihaza bağlanmak ve otomatik iki yönlü konuşma başlatmak istiyorsanız, beklediğinizin size ne alacağına karar verebilirsiniz . Bağlantı noktasını doğru parite, baud hızı ve diğer ilgili ayarlarla yapılandırmak için stty (1) kullanın .

Seri bağlantı noktası üzerinden başka bir bilgisayarla etkileşimli olarak iletişim kurmak istiyorsanız terminal emülasyon yazılımına ihtiyacınız olacaktır. Bu oldukça fazla şey yapar - portu kurar, ANSI veya diğer terminal komut dizilerini yorumlar (ANSI, seri terminaller tarafından desteklenen tek standart olmaktan uzaktı). Birçok terminal emülatörü, kermit veya zmodem gibi dosya aktarım protokollerini de destekler.

Seri haberleşme ve terminal I / O’ların giriş ve çıkışları oldukça karmaşıktır; Serideki konu hakkında bilmek istediğinizden daha fazlasını okuyabilirsiniz .


1

Bakmak isteyebilirsiniz

http://serialconsole.sourceforge.net

Pro: Kullanıcıların erişimini, sorun kabuk veren bir sorun yok, ama büyük olasılıkla eğer (Minicom veya picocom gibi bariz güvenlik problem yok do bir terminal sunucusu kurmak istiyorsanız birine sahip ... )


1

Aygıtta doğru okuma yazma izninin olduğundan emin olmanız gerekir:

$ls -l /dev/[serial device]

Bulduğun betiğe güveniyorum ve bazı değişiklikler yaptım.

Şimdiye dek kullandığım geliştirme sistemleri için, ihtiyaç duydukları:

  • Hiçbiri parite ve
  • Bir durak bit

Bu değerler koddaki varsayılan değerlerdir.

Böylece bağlanmak için, onu aşağıdaki kadar basit kullanabilirsiniz:

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

Örnek:

$./connect.sh /dev/ttyUSB0 19200

Senaryo:

#!/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 <rafaelkarosuo@gmail.com>
#   - 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"

Not: Ne tür bir satır beslemesinin alıcı sisteminizi kullandığını bilmeniz gerekiyor, çünkü bu durumda komutları nasıl göndermeniz gerektiğini belirleyeceğim, LF gibi bir Windows'a ihtiyacım vardı, bu da göndermem gerektiği anlamına geliyor.

command\r

ASCII değerleri:

  • LF: 0Ah, satır beslemesi "\ n"
  • CR: 0Dh, taşıyıcı dönüşü "\ r"
  • BS: 08 s, arka alan "<-"

1
(1)  #!/bin/shdosyanın ilk satırı değilse, yoksayılır. (2) Cidden mi? Kullandığınız 1belirtmek için bile paritesine ve 2belirtmek için garip ? (3) Sadece zorunlu olanları değil, tüm parametreleri belgeleyen bir "kullanım" veya "yardım" mesajı olması gelenekseldir . (4) Her zaman kabuk Değişken referanslarını anlatmalısın (örneğin "$1", "$2", "$3", "$4", "$stopb", "$par", "$bgPid", ve hatta "$?"ve "$!") değil için iyi bir nedeniniz varsa ve siz ne yaptığınızı bildiğinizden emin olmadıkça.
Scott


1

Neden kimsenin ser2net'ten bahsetmediğini merak ediyorum .

Örnek /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

Seri porta bağlanabildiğiniz kadar kolay:

telnet localhost 3000

Veya uzaktan:

telnet <ip> 3000

Veya yönlendiricinizde bağlantı noktası yönlendirmeyi ayarlayıp Internet'e de maruz bırakarak, herhangi bir yerden bağlanabilmeniz için (güvenlik sorunlarını atlayalım, esneklikten bahsedeceğim).


0

Bir diğer kolay seçenek de makineye -Xbayrakla ssh üzerinden erişmek ve macun veya gtkterm gibi bir program çalıştırmak.

Yani:

$ ssh -X <user>@<machine_address>

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

$ gtkterm

İstemci PC'nizde grafik arayüzü başlatmalı ve oradan da sanki sanki ana bilgisayardaymış gibi seri bağlantı noktasına erişebilirsiniz.

Yasal Uyarı: Bunu yalnızca ubuntu makineleriyle denedi. Grafik arayüzü olmayan makinelerle çalışmadığını tahmin ediyorum.

Ssh kılavuzundan:

-X

X11 iletmeyi etkinleştirir. Bu ayrıca bir yapılandırma dosyasında ana bilgisayar başına da belirtilebilir. X11 yönlendirmesi dikkatle etkinleştirilmelidir. Uzak ana bilgisayardaki dosya izinlerini atlama yeteneği olan kullanıcılar (kullanıcının X yetkilendirme veritabanı için), yerel X11 ekranına iletilen bağlantı üzerinden erişebilirler. Saldırgan daha sonra tuş vuruşu izleme gibi etkinlikler gerçekleştirebilir. Bu nedenle, X11 iletme, varsayılan olarak X11 GÜVENLİK uzantısı sınırlamalarına tabidir. Lütfen daha fazla bilgi için ssh -Y seçeneğine ve ssh_config (5) içindeki ForwardX11Trusted yönergesine bakınız.

-Y

Güvenilir X11 iletmeyi etkinleştirir. Güvenilir X11 iletimleri, X11 SECURITY genişletme denetimlerine tabi değildir.

Bu yüzden -Y, güvenlik bir sorunsa kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.