/dev/ttyS0
RS-232ポートがあり、ヌルモデムを介して互いに接続されている2台のコンピュータがあります。
私は過去に外部端末がどのように機能していたのか、そしてこれが今日のLinuxの動作方法とどのように関連しているのかを少しずつ理解しようとしています。
私は次のように動作するようにしました:
メインコンピュータ:
$ sudo socat /dev/ttyS0,raw,echo=0 exec:"/bin/bash -i",pty,stderr,setsid,sigint,sane
端末:
picocom -b 9600 /dev/ttyS0
しかし、pty
端末でこれを得る理由は次のとおりです。
# tty
/dev/pts/11
実際の実際のttyがあれば、擬似ttyは必要ありません。そうですか?私は、偽を作る前にターミナルに配線を接続したということですよね?
だから私はptyなしで作るためにsocatオプションを混ぜて一致させようとしましたが、運がありませんでした。私の端末システムに何かが表示されている場合は、キャリッジリターンやジョブ制御がなく、tty
「ttyではありません」と表示されます。
私はsocat構文(または端末設定)を理解していないことを認めなければなりません。正解を見てそこで構文を理解したいと思います。
誰かがptyなしでリモート端末を作成する方法を教えたり、これが不可能であることを受け入れるのに役立ちますか?
答え1
コマンドラインで実行している場合は、getty
rootとして実行してループにラップする必要があります。
while true; do getty -8 9600 ttyS0; done
通話はgetty
1回のセッション、つまり通常3回のログイン試行を提供するか、シリアルポートが切断信号を受信するまでのみ提供します。picocom
シリアル回線をリセットするために最初に中断が送信されると、これにより最初の回線がgetty
終了します。
シリアルポート停止信号によりプロセスが早期に終了しない場合は、getty
TTYデバイスを設定し、コンテンツを/etc/issue
端末に送信し、ログインプロンプトを表示します。有効なユーザー名を入力した場合(getty
注exec()
:いいえ fork()
まず、/bin/login
これは通常PAMライブラリを呼び出してパスワードプロンプトと残りのユーザーセッション設定を処理します。そのプロセスの一部として、プロセスのIDがログインしているユーザーに切り替えられ、getty
開始されたプロセスはログインしたユーザーのシェルをlogin
再呼び出しします。exec()
プロセスが終了した場合何らかの理由で、ユーザーのセッションが終了し、新しいgetty
ログインのための新しいプロセスが開始されます。
ループで手動で実行することは、何が起こるべきかをgetty
「視覚化する」ための良い方法ですが、長期間使用するための正しいアプローチではありません。
すべてのプロセスは、実際にライフを開始したプロセス(ログインが成功したときにユーザーのシェルに変換)が終了したgetty
ときに開始して再起動するようになっています。したがって、シリアルポートからターミナルへの実行を最新のLinuxディストリビューションを使用するinit
getty
systemd
getty
systemctl start [email protected]
再起動後も続行するには、次のことも必要です。
systemctl enable [email protected]
古典的なSysVinitを使用している場合は、ファイルにコメントされたサンプル行が必要です/etc/inittab
。その行のコメントを外して実行してtelinit q
SysVinitにその設定を再度読み取ると、ターミナルプロセスはinit
すぐに開始され、getty
必要に応じて次のように再起動する必要があります。