通过paramiko挂载失败“没有此类文件或目录”

时间:2019-04-01 10:46:05

标签: python paramiko

我正在使用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")

又没有成功。

1 个答案:

答案 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
# .
# .
# .

希望这对某人有帮助。

拍子