我正在使用python的paramiko来操纵对远程linux机器的访问。我的命令“ mount device dir”失败,并显示“ No such file or directory”,即使我远程使用它(通过ssh,而不是通过paramiko连接)也成功执行了相同的命令。
我再次尝试将/ etc / fstab更改为某些值,同样的情况。一旦我通过ssh键入它-好的,通过paramiko发出了相同的命令-错误消息上方。
有什么想法吗?
命令示例(与原点略有不同):
import paramiko
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect('192.168.1.1', username='root', password='passwd')
stdin, stdout, stderr = self.ssh.exec_command("/bin/mount /dev/sda1")
给我一个错误:
mount /dev/sda1 failed: mount: mounting /dev/sda1 on /media/card failed: No such file or directory
/ etc / fstab中的内容:
/dev/sda1 /media/card vfat fmask=0000,dmask=0000 0 0
当然,/ media / card目录存在。再次,我可以通过ssh手动使用上述命令,它可以按预期工作。
更新。 同时,我尝试了Python - How do I authenticate SSH connection with Fabric module?
中所述的python织物库(基于paramiko构建)c = fabric.Connection(host = '192.168.1.1', user = "root", connect_kwargs={'password': 'passwd'})
c.run("/bin/mount /dev/sda1")
直接给我与paramiko完全相同的错误消息。
更新2。好吧,作为变通方法,我使用直接ssh调用安装驱动器,如下面的注释中所建议。在我按照需要进行代码处理后,我尝试使用“正常” paramiko调用卸载驱动器:
self.ssh.exec_command("/bin/umount /dev/sda1")
,并且有效。所以现在我完全迷失了,如上所述的安装失败了,但是卸载却可以了。这真的很奇怪。
更新3。我试图将LD_LIBRARY_PATH额外设置为mount的库的位置,它需要libm.so.6和libc.so.6都位于/ lib中,例如:
self.ssh.exec_command("export LD_LIBRARY_PATH=/lib:/usr/lib && /bin/mount /dev/sda1")
又没有成功。
答案 0 :(得分:0)
我能够使它起作用(初稿。而且,我是python的新手)。无论如何,这是我的代码片段。
对我来说,最大的麻烦是,Windows主机名中反斜杠的要求似乎为4-> 1。
确保首先从Windows PC获得共享。在这种情况下,我的计算机/共享名是“ COMP_NAME / SHARE_NAME” 提供的用户名/密码是您访问共享的窗口凭据。
import sys
import paramiko
import constant
### START ###############################################################################
# connect to a GW device
# GW: hostname to connect to
# return: client connection object
def connectToClient(GW):
try:
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(GW, username=constant.GW_USER, password=constant.GW_PASS)
except:
print("Unexpected error:", sys.exc_info()[0])
return None
return client
### END ################################################################################
### START ###############################################################################
# execute a command on the remote device
# client: client connection object to the GW
# cmd: the command to execute
# eg. 'ls -l'
# return: nothing (TODO: maybe return error info)
def exec(client, cmd):
stdin, stdout, stderr = client.exec_command(cmd)
for line in stdout:
print(line.strip('\n'))
#for line in stderr:
# print(line.strip('\n'))
return
### END #################################################################################
# other stuff
# .
# .
# .
##########################################
# Start - upload the self extracting file to the GW
##########################################
#create the mount point
exec(client, "sudo mkdir /mnt/remote_files")
#mount the source directory (4 to 1 for the back slash chars in the UNC address ...)
exec(client, "sudo mount -t cifs -o username=oxxxxxxp,password=cxxxxxxxxx0 \\\\\\\\COMP_NAME\\\\SHARE_NAME /mnt/remote_files")
#copy the script file
exec(client, "cp /mnt/remote_files/selfextract.bsx rtls/scripts/selfextract.bsx")
#unmount the remote source
exec(client, "sudo umount /mnt/remote_files")
##########################################
# Done - upload the self extracting file to the GW
##########################################
# other stuff
# .
# .
# .
希望这对某人有帮助。
拍子