Plink在连接时不会读取bashrc或bash_profile文件

11
我正在尝试在Windows上使用plink作为ssh替代,但我发现当plink连接到远程Linux机器时,它不会source .bash_profile或.bashrc文件。
是否应该创建不同的点文件?还是有其他选项可供选择?

例如,我的bashrc文件将一个目录添加到我的路径中。这个目录包含我想要使用的额外程序之一是Python。

这样做是行不通的:

plink host python

而这将会:

plink host "source .bashrc;python"

当我使用没有命令参数的plink时,它会读取.bash_profile文件并且一切都正常工作,但是似乎仅发送一个命令,plink将不会读取任何文件。

有什么解决办法吗?

2个回答

9
被接受的答案帮助我使用plink解决了同样的问题。以下是更详细的内容,可能有助于未来的人们:
当使用plink运行单个命令进行ssh连接时,bash不会被调用为“交互式登录shell”,因此不会运行/etc/profile、~/.bash_profile、~/.bash_login或~/.profile(请参阅bash手册页)。
对于我的目的,我需要在传递给plink命令行的命令之前运行~/.profile。
可以将强制命令添加到该密钥的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...

7
如果您只是通过ssh或plink连接到远程主机,它将启动登录帐户的默认shell。如果该shell是bash,则bash将自动源.bash_profile。
如果您通过ssh或plink连接到远程主机并请求执行命令,则ssh将尝试执行该命令。
您想要实现的目标可以通过使用“ForceCommand”来实现。也可在此处查看: 将强制命令设置为一个执行两个操作的脚本:
  1. 源.bash_profile
  2. 运行原始命令(env变量$ SSH_ORIGINAL_COMMAND或$ SSH2_ORIGINAL_COMMAND)

我曾经想过为什么不创建一个shell脚本来复制bash_profile的调用,然后运行你想要plink调用的任何命令,这样不是更容易吗?直到我明白了这个答案“教会了所有plink命令如何钓鱼”,也就是说,如果每次运行相同的命令,则.sh路线更容易,但需要.sh-per-command或command-batch,而这种方法则解决了整个板块缺失的问题。 - ruffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接