11

我正在尝试在 Windows 上使用 plink 作为 ssh 替代方案,但我发现当 plink 连接到远程 linux 机器时,它不会获取 .bash_profile 或 .bashrc。
我应该创建一个不同的点文件吗?或者还有其他选择吗?

例如,我的 bashrc 文件在我的路径中添加了一个目录。这个目录包含我想使用的额外程序,一个是 python。

这将不起作用:

plink host python

这将在哪里:

plink host "source .bashrc;python"

当我在没有命令参数的情况下使用 plink 时,它会获取 .bash_profile 并且一切正常,但似乎仅发送命令 plink 不会获取任何一个文件。

有解决方法吗?

4

2 回答 2

9

接受的答案帮助我使用 plink 解决了同样的问题。这里有一些更多的细节可能对未来的人们有所帮助:

当使用 plink 建立 ssh 连接以运行单个命令时,bash 不会作为“交互式登录 shell”调用,因此它不会运行 /etc/profile、~/.bash_profile、~/.bash_login 或 ~/ .profile(参见 bash 手册页)。

出于我的目的,我需要 ~/.profile 在 plink 命令行中传递的命令之前运行。

可以将强制命令添加到该密钥的 authorized_keys 文件中(请参阅 sshd 手册页)。强制命令(例如运行 ~/.profile)会阻止它运行 plink 指定的命令,因此要让它同时执行这两种操作,强制命令应该是执行运行 .profile 的脚本,然后是原始 plink 命令。后者存储在环境变量 $SSH_ORIGINAL_COMMAND 中,因此您的脚本可以执行

source .profile
$SSH_ORIGINAL_COMMAND

并且您在 ~/.ssh/authorized_keys 文件中指定脚本,如下所示,在密钥之前,在同一行:

command="source forced_command.script" ssh-rsa A3AABzaC1yc...
于 2013-07-02T12:55:10.057 回答
7

如果您只是通过 ssh 或 plink 连接到远程主机,它将启动登录帐户的默认 shell。如果该 shell 是 bash,bash 将自动获取 .bash_profile。

如果您通过 ssh 或 plink 连接到远程主机要求执行命令,则 ssh 将尝试仅执行该命令。

您想要实现的目标可以通过使用ForcedCommand来完成。另请参阅此处:

将强制命令设置为执行 2 件事的脚本:

  1. 获取 .bash_profile
  2. 运行原始命令(环境变量 $SSH_ORIGINAL_COMMAND 或 $SSH2_ORIGINAL_COMMAND)
于 2010-08-05T09:55:44.713 回答