3

この質問は、 Python を使用してファイルをネットワーク パスまたはドライブにコピーする方法に似てい ます。私はコードを試しました:

from contextlib import contextmanager
@contextmanager

def network_share_auth(share, username=None, password=None, drive_letter='P'):

    """Context manager that mounts the given share using the given
    username and password to the given drive letter when entering
    the context and unmounts it when exiting."""

    cmd_parts = ["NET USE %s: %s" % (drive_letter, share)]

    if password:
        cmd_parts.append(password)
    if username:
        cmd_parts.append("/USER:%s" % username)
    os.system(" ".join(cmd_parts))
    try:
        yield
    finally:
        os.system("NET USE %s: /DELETE" % drive_letter)

with network_share_auth(r"\\ComputerName\ShareName", username, password):
    shutil.copyfile("foo.txt", r"P:\foo.txt")

エラーが表示されます: sh: NET: 見つかりません

これは、「NET USE」がWindows固有であるためだと思います。Linuxで同様のことを行うにはどうすればよいですか?

ありがとう!ハルマイニ

4

4 に答える 4

4

Linuxでは、 smbmountを使用して、ここでNETが使用されているのと同じことを行います。

于 2011-09-01T19:27:10.470 に答える
2

ご回答ありがとうございます。私はそれを機能させるmount -t smbfs代わりに使用smbmountしなければなりませんでした。これはうまくいきました:

        cmd_parts = ["mount -t smbfs"]
        if password:
            cmd_parts.append("-o password=%s,user=%s %s %s" % (password, username, share, drive_letter))
        os.system(" ".join(cmd_parts))
于 2011-09-07T14:48:23.353 に答える
0

1.cifs-utilsをインストール

sudo apt-get install cifs-utils

2.共有用のディレクトリを作成します。このようなもの:

sudo mkdir /media/localShareName

localShareName の代わりに別の名前を使用できます。

3. Python 関数をコーディングする

def mountWindowsShare():

    cmd1 ='sudo mount -t cifs' + '  '
    cmd1+='//Server_IP_Address/ShareFolder' + '  '
    cmd1+='/media/localShareName' + '  '
    cmd1+='-o username=<usernameOfWindowsShare>,'
    cmd1+='password=<passwordOfWindowsShare>,'
    cmd1+='domain=<DomainOfWindowsServer>,'
    cmd1+='noexec'

    os.system(cmd1)

    ''' 
          do whatever you want like:

    print(os.listdir('/media/localShareName'))
    '''

    os.system('sudo umount /media/localShareName')

交換

Windows ワークステーションまたはサーバーの IP アドレスによる Server_IP_Address

< usernameOfWindowsShare > Windows 共有のユーザー名による

< passwordOfWindowsShare > Windows共有のパスワードによる

< DomainOfWindowsServer > Windows サーバーのドメイン別。それはほとんどWORKGROUPです

パスワードのプロンプトを回避したい場合 (本当に必要な場合)、visudoを参照してください。

sudo visudo

エディターで開いたファイルに次の行を入力します

username ALL=(ALL) NOPASSWD: ALL

username を Ubuntu のユーザー名に置き換えます。ファイルを保存します ( Ctrl+x を押してから Y を押します)。ログアウトとログイン

于 2016-03-13T13:56:52.433 に答える
0

これはうまくいくはずです。Linux はドライブ文字ではなく、ルート ファイルシステムを使用することに注意してください。また/mnt/P、これは、Linux ボックスにというフォルダーがある場合にのみ機能することに注意してください。存在しないフォルダにはマウントできません。

from contextlib import contextmanager
@contextmanager

def network_share_auth(share, username=None, password=None, drive_letter='/mnt/P'):

    """Context manager that mounts the given share using the given
    username and password to the given drive letter when entering
    the context and unmounts it when exiting."""

    cmd_parts = ["smbmount %s %s" % (share, drive_letter)]

    if password:
        cmd_parts.append("-o password=%s,username=%s" % (password, username))
    os.system(" ".join(cmd_parts))
    try:
        yield
    finally:
        os.system("umount %s" % drive_letter)

with network_share_auth(r"//ComputerName/ShareName", username, password):
    shutil.copyfile("foo.txt", r"/mnt/P/foo.txt")
于 2011-09-01T20:03:45.727 に答える