plink
是 Windows 可执行文件,它通过 ssh 连接并在服务器端执行一些命令。
例如
plink myname@mycomputer ls
将显示 ls 命令的结果,该命令在 myname 的主目录中执行。
不幸的是,两者都~/.profile
没有~/.bashrc
被执行。
什么是连接契约ssh
,定义了什么,设置了哪些变量,未设置哪些变量?如果我跑
plink myname@mycomputer env
我看到一些变量,例如HOME
、PWD
和LOGNAME
,这些变量是特定于用户的。其他的怎么设置?
以下均无帮助:
plink myname@mycomputer sh -c env
plink myname@mycomputer bash -c env
这些命令有效,但显示了“裸”变量集。
如何告诉 shell 为用户执行它的初始脚本?
答案1
ssh
可以观察运行的内容,例如sysdig
在一个终端中,然后在其他地方运行plink myname@mycomputer uptime
,应该显示类似的内容
$ sudo sysdig -p '%proc.cmdline' 'evt.type = execve'
sshd
bash -c uptime
bash -c uptime
uptime
因此在这种情况下bash
正在使用参数运行(例如在默认情况下不安装的 Alpine Linux 上可能不是这种情况bash
)-c uptime
。这bash
或多或少会直接导致exec
该命令,因为没有需要bash
继续运行的花哨管道或多个 shell 命令。
接下来,我们可以记录打开的文件bash
,然后再次运行plink ... uptime
命令(这可能会更详细,具体取决于系统上发生的其他情况):
$ sysdig 'evt.type = open and proc.name = "bash"'
7847 16:03:48.388447919 0 bash (22135) > open
7848 16:03:48.388466237 0 bash (22135) < open fd=3(<f>/etc/ld.so.cache) name=/etc/ld.so.cache flags=4097(O_RDONLY|O_CLOEXEC) mode=0
7855 16:03:48.388669720 0 bash (22135) > open
7856 16:03:48.388695391 0 bash (22135) < open fd=3(<f>/lib64/libtinfo.so.5) name=/lib64/libtinfo.so.5 flags=4097(O_RDONLY|O_CLOEXEC) mode=0
7871 16:03:48.389069345 0 bash (22135) > open
7872 16:03:48.389082901 0 bash (22135) < open fd=3(<f>/lib64/libdl.so.2) name=/lib64/libdl.so.2 flags=4097(O_RDONLY|O_CLOEXEC) mode=0
7885 16:03:48.389284722 0 bash (22135) > open
7886 16:03:48.389290872 0 bash (22135) < open fd=3(<f>/lib64/libc.so.6) name=/lib64/libc.so.6 flags=4097(O_RDONLY|O_CLOEXEC) mode=0
7921 16:03:48.391876315 0 bash (22135) > open
7922 16:03:48.391927051 0 bash (22135) < open fd=-6(ENXIO) name=/dev/tty flags=67(O_NONBLOCK|O_RDWR) mode=0
7945 16:03:48.393905761 0 bash (22135) > open
7946 16:03:48.393957884 0 bash (22135) < open fd=3(<f>/proc/meminfo) name=/proc/
meminfo flags=4097(O_RDONLY|O_CLOEXEC) mode=0
8049 16:03:48.395910893 0 bash (22135) > open
8050 16:03:48.395916693 0 bash (22135) < open fd=3(<f>/root/.bashrc) name=/root/.bashrc flags=1(O_RDONLY) mode=0
所以看来/root/.bashrc
这里正在我的测试虚拟机上阅读;为了确认这一点,我们可以向该文件添加一些内容,然后在服务器上再次运行我们的测试命令:
echo echo echo >> ~/.bashrc
plink ...
然后我们再次连接(根据需要调整命令)
$ ssh gato uptime
echo
16:05:20 up 5:19, 1 user, load average: 0.11, 0.38, 0.27
$
所以在这种情况下.bashrc
是正在读取,因此您可以在其中输入命令。我不确定为什么你的情况.bashrc
没有被阅读;追踪事物以了解发生了什么。