外部プロセスからSSHクライアントプロセス内の作業ディレクトリをインポートする

外部プロセスからSSHクライアントプロセス内の作業ディレクトリをインポートする

SSH経由でリモートコンピュータに接続しました。lsそのリモートコンピュータの現在の作業ディレクトリをインポートし(好ましくは同様のコマンドを実行したいが)、プロセスの外部からインポートしたいと思います。

これが私のプロセスです

$ ps
49100 ttys001    0:00.21 -zsh
52134 ttys002    0:00.21 -zsh
52171 ttys002    0:00.05 ssh [email protected]

ターミナル2(ttys002)は現在リモートシステムにSSHで接続しています。

クライアントシステムからリモートホストの現在の作業ディレクトリを取得できますか?つまり、pwd端末2に入力する必要はありません。

実行すると、lsofプロセスのローカルコンピュータから現在の作業ディレクトリを取得できますが、リモートコンピュータでは取得できません。

~ $ lsof -p 52171
COMMAND   PID    USER   FD      TYPE             DEVICE SIZE/OFF                NODE NAME
ssh     52175   falky  cwd       DIR                1,4     2816              994619 /Users/falky

これが不可能な場合は、SSHを介してリモートシステムに接続する前にこれを行う方法はありますか?たとえば、疑似端末を設定できますか?それとも私のローカルコンピュータにpingを送り返すリモートコンピュータに何かをインストールできますか?ここにアドバイスや指示があれば役に立ちます。

答え1

これが不可能な場合は、SSHを介してリモートシステムに接続する前にこれを行う方法はありますか?

「接続共有モード」でSSHクライアントを起動できます。

ssh -M -S ~/.ssh/%r@%h:%p user@localhost
user@localhost's password:
...
user@localhost$ echo $$
5555
user@localhost$ cd /some/path

他の端末から:

ssh -S ~/.ssh/%r@%h:%p user@localhost
<no need to enter the password again>
user@localhost$ ls -l /proc/5555/cwd
<listing of /some/path>

ssh(1)マンページを参照して調べてください。-Sそして-Mオプションssh_config(1)Control*構成オプション。

答え2

これを行う唯一の方法は次のとおりです。

  1. ioctlを使用してローカル端末にコマンドを挿入しますTIOCSTI。これはOpenBSDでは機能しません。Linuxでは、CAP_SYS_ADMIN呼び出しプロセスの制御tty以外のttyでそれを使用するにはcap(つまりルート)が必要です。TIOCSTIこのサイトではすでに多くの使用例を見つけることができます。

  2. ptrace(2)SSHクライアントを操作し(たとえば、デバッガや他のデバッガを介して)、暗号化されたgdb(1)チャネルにコマンドを挿入します。これを行う方法は、主にsshクライアントの内部によって異なります(即時実行可能な例では、デバッグシンボルでコンパイルされたsshクライアントが必要です)。他のソリューションと同様に、制限がある場合(たとえばrootユーザー)でptrace(2)ない限り、他のユーザーのプロセス(またはプロセス自体がダンプ不能になる場合)では機能しません。CAP_SYS_PTRACE

  3. ポイント2に従ってください。 SSH クライアントを実行する pseudo-tty ホストのプロセスを制御し、pseudo-tty ホストのファイル記述子にコマンドを書き込みます。一部の内部チャネルではなくファイル記述子にデータを書き込む必要があるため、例を挙げるのは簡単です。

ターミナルから:

$ tty
echo $PPID
6666
$ ssh localhost
localhost$ cd /tmp
localhost$

他の端末でPPID=6666(ローカルシェルの親プロセス)が端末エミュレータのプロセスであると仮定すると(保証なし!)、どのファイル記述子がそのシェルの端末を参照しているかを正確に推測できます(端末エミュレータがこの時点まで実行されている場合は実行します。難しいです)。 GNUスクリーンのような一種のシングルプロセスマルチプレクサです):

$ pid=6666
$ ls -l /proc/$pid/fd
...

lrwx------ 1 xxx xxx 64 Oct 12 08:52 3 -> /dev/ptmx  # the pty master
...
$ grep flags /proc/$pid/fdinfo/3
flags:  0104002    # OK, it's opened in rw mode (2)
$ gdb -p $pid
...
(gdb) call write(3, "pwd\r", 4)
$1 = 4
(gdb) continue
Continuing.
...

すべてが順調に進むと、pwdコマンドはリモートSSHで実行されます。

sshの起動方法を制御できる場合は、3番目の項目に従ってpseudo-ttyを制御するプロセスが複雑なマルチプレクサではなく単純なプロセスであることを確認できます。 Linuxでは、次のものを使用できます。script(1)便利:

script /dev/null -c 'ssh user@host'

script=プロセス内のttyマスターのファイル記述子いつもLinuxでは、sshが直接実行されているのか、.3経由で実行されているのか心配する必要はありません/bin/some/sh -c

関連情報