<p>从2.1.0版2016-12-09开始,您可以将环境变量字典添加到exec_命令中:</p>
<pre><code>import paramiko
paramiko.util.log_to_file("paramiko.log")
ssh = paramiko.SSHClient()
k = paramiko.RSAKey.from_private_key_file("<private_key_file>")
ssh.connect(<hostname>,username=<username>,pkey=k)
env_dict={"LC_TELEPHONE":"ET_HOME","LC_MEASUREMENT":"MILES_APART"}
stdin , stdout, stderr = ssh.exec_command('echo $LC_TELEPHONE; echo "..."; echo $LC_MEASUREMENT',environment=env_dict)
print stdout.read()
</code></pre>
<p>输出:</p>
<pre><code>ET_HOME
...
MILES_APART
</code></pre>
<p>但我为什么选择LC_电话和LC_测量?因为这是目标主机的ssh配置允许我设置的少数几个环境中的两个:</p>
<pre><code>grep AcceptEnv /etc/ssh/sshd_config
</code></pre>
<p>输出:</p>
<pre><code>AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL
</code></pre>
<p>换句话说,这不起作用:</p>
<pre><code>env_dict={"HELLO":"WORLD","GOODBYE":"CRUEL_WORLD"}
stdin , stdout, stderr = ssh.exec_command("echo $HELLO; echo '...'; echo $GOODBYE")
print stdout.read()
</code></pre>
<p>输出:</p>
<pre><code>...
</code></pre>
<p>正如文档中警告的那样,环境变量将被静默拒绝
<a href="http://docs.paramiko.org/en/2.1/api/client.html" rel="noreferrer">http://docs.paramiko.org/en/2.1/api/client.html</a>
<a href="http://docs.paramiko.org/en/2.1/api/channel.html#paramiko.channel.Channel.set_environment_variable" rel="noreferrer">http://docs.paramiko.org/en/2.1/api/channel.html#paramiko.channel.Channel.set_environment_variable</a></p>
<p>如果无法控制目标服务器的sshd配置,则将环境变量放入一个文件并对其进行源化即可:</p>
<pre><code>stdin , stdout, stderr = ssh.exec_command("cat .set_env;source .set_env; echo $HELLO; echo '...'; echo $GOODBYE")
print stdout.read()
</code></pre>
<p>输出:</p>
<pre><code># begin .set_env
HELLO="WORLD"
GOODBYE="CRUEL_WORLD"
# end .set_env
WORLD
...
CRUEL_WORLD
</code></pre>