使用Paramiko加载.bashrc的SSH

4

我希望能够通过Python自动化使用ssh(putty)执行相同的操作。在使用putty连接后,我的.bashrc被加载(这样我就可以使用别名)。但如果我试图在Python中执行此操作,则别名sanity将不可见:

sanity: command not found

使用 source .bashrc 并不是解决方案。

 ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect('xxxxxxx', username='x',   password='x',  key_filename=None, look_for_keys=False)
    stdin, stdout, stderr = ssh.exec_command(
    """
    sanity;
    """)

    stdout.flush()
    for line in stdout:
        print line
    print "END"

    print stderr.read()
    ssh.close()

1
请分享您的控制台输出(在使用Sanity时)(Sanity应用程序在哪里?) - dsgdfg
这更加复杂,我们必须在 Linux 上使用复杂别名(不是由我们编写的)。因此,分析别名并手动运行它不是好主意。我需要运行此 SSH,就像我在机器上有终端一样。 - Bartłomiej Bartnicki
3个回答

7

比理由更重要的是解决方案 :), 你能告诉我如何在Python中做到和PuTTY一样吗? - Bartłomiej Bartnicki
解决方案在我提供的链接中。 - scytale
哪一个?- 我建议第二个。如果都不行的话,可以考虑超级用户网站链接中提供的其他解决方案。 - scytale

2

来自 bash 手册:

当 shell 非交互式时,别名不会被扩展,除非使用 shopt 设置 expand_aliases shell 选项。

因此,如果您想使用别名,必须先设置 expand_aliases 选项。


你能告诉我应该怎么做吗? - Bartłomiej Bartnicki
1
@BartłomiejBartnicki - 请查一下谷歌:http://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html - scytale

1

其他提交的解决方案对我没有用。我不得不强制使用交互式 shell 并同时使用 get_pty。以下代码已经测试并在 Ubuntu 上运行:

source_bashrc = True # switch this flag to revert to 'normal' execution
command_to_execute = 'll'

if source_bashrc:
   command_to_execute = f'bash -ic "{command_to_execute}"'

client.exec_command(command_to_execute, get_pty=source_bashrc)

-i 标志创建一个交互式终端,它会来源于bashrc。 我从这个链接得到了提示。


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