使用Python连接到本地主机的SSH和telnet

3

我是Python的新手,如果问题很初级,我很抱歉。简单地说,我需要编写一个脚本,通过ssh连接到远程主机,然后telnet到本地主机,在那里执行一些命令。

我正在使用Python 2.4.3。我已经阅读了很多类似的问题,并且很多人建议使用Paramiko、Pexpect等模块。然而这是不可能的——我只能使用“本地”的2.4.3库。我尝试了subprocess模块,并成功连接到远程shell(但我需要提供密码——我希望通过在脚本中提供密码来避免)——但是我仍然需要在不同的shell中执行telnet并执行几个命令。

有没有人能够给我一些提示?提前感谢您。

简而言之,我正在寻找Python版本的以下Bash命令的替代方案:

./sshpass -p password ssh username@$ip -t "(sleep 1;echo "command" ; sleep 1) | telnet localhost $port;exit;bash" >> testing.txt


1
你实际上想要达到什么目的?如果你已经通过ssh登录,那么通过telnet本地主机就毫无意义了——这只会增加一个不安全的本地第二个连接。 - tripleee
这是我在技术大学编程课程的内容。基本上,我们在服务器上安装了Fedora,并通过localhost连接了各种网络设备。我们需要做的是登录到服务器,然后连接到这些设备,在它们的自定义shell上执行命令并将输出保存到我们桌面上的文件中。两周前我们用bash完成了同样的事情 - 这就是我们的做法。现在我们需要使用Python完成相同的任务。 - sztyrymytyry
你需要在ssh连接中使用Python吗?这真的没有意义。一旦你进入了shell,你就已经在里面了。 - tripleee
但是使用ssh端口转发,您可以公开端口并使用本地的socket调用连接到那些端口。这是您想要的吗? - tripleee
我们需要编写一个Python脚本,连接到一个设备并执行一条命令,将输出保存到一个文件中。这个设备被连接为localhost,使用指定的端口连接到远程服务器上的Fedora系统,具有给定的ip地址。抱歉,我只是一名二年级的学生,还不确定您的意思。使用bash相当简单,因为我使用了类似这样的命令:./sshpass -p password ssh username@$ip -t "(sleep 1;echo "command" ; sleep 1) | telnet localhost $port;exit;bash" >> testing.txt,我想在Python中做类似的事情。 - sztyrymytyry
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - tripleee
1个回答

2
经过简单搜索:

telnet链接

import getpass
import sys
import telnetlib

HOST = "hostname"

user = raw_input("Enter your remote account: ")

password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until("login: ")

tn.write(user + "\n")

if password:
    tn.read_until("Password: ")
    tn.write(password + "\n")

tn.write("ls\n")

tn.write("exit\n")

print tn.read_all()

ssh: 链接

import pxssh
import getpass
try:                                                            
    s = pxssh.pxssh()
    hostname = raw_input('hostname: ')
    username = raw_input('username: ')
    password = getpass.getpass('password: ')
    s.login (hostname, username, password)
    s.sendline ('uptime')   # run a command
    s.prompt()             # match the prompt
    print s.before          # print everything before the prompt.
    s.sendline ('ls -l')
    s.prompt()
    print s.before
    s.sendline ('df')
    s.prompt()
    print s.before
    s.logout()
except pxssh.ExceptionPxssh, e:
    print "pxssh failed on login."
    print str(e)

非常感谢!我会尝试让它工作起来! - sztyrymytyry
该死,我的机器上没有pxssh,而且我不应该使用除我已有的模块之外的任何其他模块:S 有没有一种通过子进程连接SSH并提供密码的方法? - sztyrymytyry
@sztyrymytyry,你可以尝试将密码提供给stdin - Urban48

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