我的情况:我有一个Ansible服务器,一个塔式服务器,一个Windows文件服务器和一个Windows客户端。 通过Ansible,我想告诉Windows客户端从Windows文件服务器复制一些文件。 在find允许我将文件从远程主机复制到客户端机器的剧本模块之后,我决定尝试一系列不同的Powershell脚本和cmdlet来执行简单的文件复制。
我似乎遇到了双跳问题,并且由于Ansible / Linux服务器是这种情况下的原始机器,而且我没有控制该机器,所以我想知道是否有人解决了这个问题并设法获取脚本通过双跳。 另外,如果有人知道一个Ansible模块可以将文件从远程主机复制到客户端主机,那也是很有意思的。 如果我需要为Ansible所有者提交一张票来做某件事,或者如果我需要做某件事情,或者如果我应该放弃,无论如何,谢谢你的时间!
虽然这是一个绝对的黑客,我相信你已经从这个问题上解决了,一个解决方法是创build一个计划任务(使用Windows schtasks命令),并立即执行它来执行复制。 计划的任务将运行在正确的上下文中,并且能够从服务器复制而不会遇到双跳问题,因为它来自客户机。 我确定这个问题有一个Ansible级的解决scheme,但这是我目前的解决方法。
您的更高级别的脚本可以使用psutil或类似的东西来监视任务,不会返回,直到计划的任务完成。
这里是我用Python编写的帮助程序脚本来完成这个任务:
# run_as_scheduled_task.py import psutil import subprocess import time import sys to_match = sys.argv[1] to_run = ' '.join(sys.argv[2:]) print("Running the following command as immediate scheduled task:") print(to_run) print("Will return only once process matching wildcard \"{0}\" is no longer found".format(to_match)) subprocess.call('C:\\Windows\\System32\\schtasks /delete /f /tn "QUICKSCHTASK"', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) subprocess.call('C:\\Windows\\System32\\schtasks /create /tn "QUICKSCHTASK" /tr "{0}" /sc ONCE /st 00:00'.format(to_run), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) subprocess.call('C:\\Windows\\System32\\schtasks /run /tn "QUICKSCHTASK"', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) time.sleep(0.1) def processDead(proc): print("Process is now dead - {0}".format(proc)) subprocess.call('C:\\Windows\\System32\\schtasks /delete /f /tn "QUICKSCHTASK"', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) process = None for proc in psutil.process_iter(): if to_match in proc.name(): gone, still_alive = psutil.wait_procs([proc], None, processDead) break
您可以从更高级别的脚本调用此操作来执行操作并绕过双跳。 很hacky,但它的作品。 脚本的示例用法是:
start /wait py -3 run_as_scheduled_task.py 'robocopy' 'robocopy SOURCE DEST'
另一种方法是使用-s标志调用目标计算机上的psexec以使用系统帐户。 更多的信息在这里: https : //stackoverflow.com/questions/15242248/double-hop-access-to-copy-files-without-credssp