8

Linuxコンソールから直接実行した場合に異なる動作をする必要があるアプリケーションがあります。したがって、ユーザーがSSHに接続してFooBarを実行する場合、またはユーザーがコンソールに移動して直接ログインしてFooBarを実行する場合は、別のことを実行する必要があります。

これら2つのシナリオの違いを伝えるために、どのC APIを呼び出す必要がありますか?「tty/pts」情報(「psaxf」を実行したときに表示される情報など)を確認する必要があると思っていましたが、それが最善の解決策であるかどうか、またどのAPIを呼び出すかはわかりません。その情報を取得します。

ヒントをいただければ幸いです。:)

4

5 に答える 5

8

なりすましの心配の程度に応じて、SSH_CLIENTおよびSSH_CONNECTION環境変数の有無を簡単に確認できます。この場合、このgetenv関数が必要になります。

于 2010-05-25T20:00:28.137 に答える
6

ttyname(3)の戻り値をstdinと照合すると、プロセスの入力を供給している端末の名前がわかります。

プログラムがコンソールで実行されている場合(および入力がリダイレクトされていない場合)は/ dev/consoleになります。stdoutをチェックして、/ dev/consoleに接続されているかどうかを確認することもできます。どちらが使用シナリオにより適しているかを確認してください。

于 2010-05-25T20:06:20.040 に答える
5

ttynameは、特定のファイル記述子に接続されている端末の名前を示します。たとえば、ttyname(0)stdinの端末を教えてくれます。

もちろん、入力または出力がリダイレクトされると、これは失敗します。

それを除けばSSH_CONNECTION、さまざまな環境変数(、、、、、)SSH_CLIENTを確認できます。 Wiresharkには、リモートで実行されているかどうかを検出するロジックがあり、生成されたネットワークトラフィックをキャプチャしません。get_conn_cfilter関数がこれを実装するために使用するロジックに興味があるかもしれません。REMOTEHOSTDISPLAYSESSIONNAME

于 2010-05-25T20:10:59.090 に答える
3

私は環境変数を何が起こっているのかを示す合理的な兆候と見なします。そのためにどのCAPIが必要かはわかりませんが、存在することは確かです。

たとえば、使用されているSSHクライアントに関係なく、SSH_CLIENTまたはSSH_CONNECTION環境変数の両方が私のマシンに設定されています。

マシン上で実行されているSSHサーバーに基づいて、これらがどれほど普遍的であるかを確認する価値があるかもしれません。

于 2010-05-25T20:02:28.040 に答える
0

醜いが、動作します:

// don't force scripts to pause!
if (_isatty(_fileno(stdout)))
{
    _tprintf(_T("\nPress enter to continue..."));
    _gettc(stdin);
}
于 2019-01-30T15:57:24.497 に答える