我正在嘗試從 Web 應用程式伺服器存取一些遠端檔案。我們將它們稱為伺服器 M 和 R。
遠端檔案位於伺服器 R 上的檔案共用上,每個人都可以讀取(共用權限和安全權限允許Everyone
讀取)。此共享稱為\\R\EthRelease
.
Web 應用程式位於伺服器上M
。我正在 Tomcat servlet 容器下運行 Python(實際上是 Jython)腳本(透過BSF)以便嘗試存取 上的遠端檔案R
。
但無論我做什麼,腳本無法看到遠端共用資料夾。例如,我使用 Python 程式碼,例如:
# Note, R: is a mapped network drive pointing to \\R\EthRelease
for file in ['C:', 'C:\\', 'C:\\Users', 'R:', 'R:\\',
r"\\R\EthRelease", r"\\172.x.x.x\EthRelease"]:
output.append(" <accessCheck dir='%s' exists='%s' accessF='%s' accessR='%s'/>\n" %
(file, os.path.exists(file), os.access(file, os.F_OK),
os.access(file, os.R_OK)))
腳本表示存在的唯一資料夾是C:\
和C:\Users
:
<accessCheck dir="C:" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="C:\" exists="True" accessF="True" accessR="True"/>
<accessCheck dir="C:\Users" exists="True" accessF="True" accessR="True"/>
<accessCheck dir="R:" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="R:\" exists="False" accessF="False" accessR="False"/>
<accessCheck dir="\\R\EthRelease" exists="False" accessF="True" accessR="True"/>
<accessCheck dir="\\172.x.x.x\EthRelease" exists="False" accessF="False" accessR="False"/>
相比之下,當我dir
在伺服器 M 上的 CMD 提示字元中對上述任何路徑執行 a 操作時,它們都存在並且可讀:
C:\Users\me>dir r:\
Volume in drive R is GIS
Volume Serial Number is ...
Directory of r:\
12/03/2012 09:18 AM <DIR> .
12/03/2012 09:18 AM <DIR> ..
07/25/2013 08:51 AM <DIR> EGI
12/17/2013 05:46 AM <DIR> maps
0 File(s) 0 bytes
4 Dir(s) 48,192,491,520 bytes free
C:\Users\me>
我已在 Jython stable 2.5.3 和 Jython beta 2.7b1 上嘗試過此操作,並獲得了相同的結果。我知道這不僅僅是 Python 問題,因為我在筆記型電腦上運行類似的命令(使用 Python 3.3)並且能夠成功存取相同的網路共用。
一個可能的區別是 servlet 容器 Tomcat 在伺服器 M 上以本機 SYSTEM 使用者身分執行,而在 CMD shell 中我以另一個使用者登入。但正如前面提到的,Everyone
可以存取遠端文件共享,所以這應該沒有什麼區別,對吧?有什麼方法可以以 SYSTEM 使用者身分登入並測試我是否能夠在該狀態下存取遠端檔案共用嗎?
另一個可能的區別是 servlet 容器或 BSF 可能會施加某種沙箱限制,阻止我存取 servlet 容器外部的檔案。但這並沒有發生,因為我可以檢查C:\
。
有任何想法嗎?這一直讓我陷入困境。我之前嘗試過幾次不同的方式直接從內部存取文件繭,並撞到同樣類型的牆壁。最近我想著『尤里卡!我可以將問題外包給 Python 腳本! Python 可以處理它!但到目前為止,還沒有骰子。
答案1
正如這些超級用戶問題中所討論的 –提升的命令列提示字元無法存取 Windows 7 中的共用磁碟機和如何從 Windows 7 中的提升進程存取網路共用?– 磁碟機對應與登入相關聯,因此 SYSTEM 沒有它們,除非您做出特殊安排。您可能需要透過 UNC 或NET USE
透過程式碼執行操作來操作遠端檔案。請注意,您的測試程序報告它具有F
併R
訪問\\R\EthRelease
.