我正在尝试通过 ssh 连接获取本地计算机上的基本信息。这里的目的是在我的 tmux 状态栏中获取当前用户、主机名、当前工作目录。
我已经ControlMaster
在我的中启用了~/.ssh/config
:
Host *
ControlMaster auto
ControlPath ~/.ssh/socket-%r@%h:%p
现在,我已经成功地从自制的 tmux 插件中获取了ControlPath
,并且我可以通过套接字发送命令:
echo $(ssh -S ~/.ssh/socket-$user@$host:$port $host "$command")
这可以很好地获取远程主机名和用户。问题是,当我更改远程用户时,whoami
仍然返回用于登录的用户。
例如whoami
(~
是本地的,>
在 ssh 会话上执行):
~ ssh soyuka@host
> whoami
soyuka
~ ssh -S ~/.ssh/socket-soyuka@host:22 host whoami
soyuka
> sudo -s
> whoami
root
~ ssh -S ~/.ssh/socket-soyuka@host:22 host whoami
soyuka #Here I want to get root because the remote user is now root
例如pwd
(~
是本地的,>
在 ssh 会话上执行):
~ ssh soyuka@host
~ ssh -S ~/.ssh/socket-soyuka@host:22 host pwd
/home/soyuka
> cd downloads
> pwd
/home/soyuka/downloads
~ ssh -S ~/.ssh/socket-soyuka@host:22 host pwd
/home/soyuka #Here I want to get /home/soyuka/downloads
是否可以通过套接字在当前 ssh 会话上执行命令?
答案1
你所要求的似乎没有意义。
这里我想获得root,因为远程用户现在是root
不,远程用户现在是 root。您在本地系统上完成的操作sudo -s
并不会改变您soyuka
远程 ssh 进入帐户的事实。
“在这里我想获取/home/soyuka/downloads”的答案是类似的。
是否可以通过套接字在当前 ssh 会话上执行命令?
我相信您可能有一个误解,认为存在持久的长寿命 SSH 会话。事实上,每次你这样做时:
ssh -l remoteuser host some-command
...A新的SSH 会话打开,some-command
在该会话中执行(没有 pty,与未指定远程命令打开的 SSH 会话不同),然后关闭该会话。
即使存在这样一个持久的远程会话,也没有理由期望在本地执行诸如sudo
或 之类的操作cd
会以任何方式影响该远程会话。
您使用 SSH 控制套接字这一事实根本不会改变这一点。与普通会话相比,从属 SSH 会话的唯一不同之处在于 SSH会议搭载于现有的 SSH联系而不是全新的连接。