ttyname は、指定されたファイル記述子に接続されている端末の名前を示します。例:ttyname(0) stdin の端末を教えてくれます。
入力または出力がリダイレクトされた場合、これはもちろん失敗します。
それを除けば、さまざまな環境変数を確認できます (SSH_CONNECTION 、 SSH_CLIENT 、 REMOTEHOST 、 DISPLAY 、 SESSIONNAME )。 Wireshark には、生成されたネットワーク トラフィックをキャプチャしないように、リモートで実行されているかどうかを検出するロジックがあります。 get_conn_cfilter 関数がこれを実装するために使用するロジックに興味があるかもしれません.
stdin に対して ttyname(3) の戻り値をチェックすると、プロセスの入力を供給している端末の名前が得られます。
プログラムがコンソールで実行されている場合 (および入力がリダイレクトされていない場合) は /dev/console になります。 stdout をチェックして、それが /dev/console に接続されているかどうかを確認することもできます。どちらが使用シナリオに適しているかを確認してください。
何が起こっているかの合理的な兆候として、環境変数を見たいと思います。そのためにどの C API が必要かはわかりませんが、存在することは確かです。
たとえば、両方の SSH_CLIENT または SSH_CONNECTION 使用している SSH クライアントに関係なく、マシンに環境変数が設定されています。
マシンで実行されている SSH サーバーに基づいて、これらがどの程度普遍的であるかを確認する価値があるかもしれません。
なりすましをどの程度心配しているかにもよりますが、SSH_CLIENT および SSH_CONNECTION 環境変数の有無を簡単に確認できます。この場合、getenv が必要になります。 関数。