此问题类似于How to copy files to network path or drive using Python 但是,我在Linux上并尝试将文件复制到通过samba访问的Windows共享网络。 我尝试了代码:
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:not found
我认为这是因为'NET USE'是特定于Windows的。我如何在Linux中做类似的事情?
谢谢! Harmaini
答案 0 :(得分:4)
在linux上,您可以使用smbmount执行与此处使用NET相同的操作。
答案 1 :(得分: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))
答案 2 :(得分:0)
这对你有用。请注意,Linux使用根文件系统,而不是驱动器号。 同样请注意,只有在Linux机器上有一个名为/mnt/P
的文件夹时,这才有效。您无法安装到不存在的文件夹。
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")
答案 3 :(得分: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')
替换
Server_IP_Address按Windows工作站或服务器的IP地址
&LT; usernameOfWindowsShare&gt;按用户名分享
&LT; passwordOfWindowsShare&gt;通过Windows共享密码
&LT; DomainOfWindowsServer&gt;通过Windows服务器的域。它几乎是WORKGROUP
如果您想避免提示密码(如果确实有必要),请参阅visudo
sudo visudo
在编辑器
中键入已打开文件的以下行username ALL=(ALL) NOPASSWD: ALL
在Ubuntu上用您的用户名替换用户名。保存文件(Ctrl + x然后按Y)。注销并登录