天道酬勤,学无止境

Paramiko / scp - check if file exists on remote host

I'm using Python Paramiko and scp to perform some operations on remote machines. Some machines I work on require files to be available locally on their system. When this is the case, I'm using Paramiko and scp to copy the files across. For example:

from paramiko import SSHClient
from scp import SCPClient

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('192.168.100.1')

scp = SCPClient(ssh.get_transport())
scp.put('localfile', 'remote file')
scp.close()

ssh.close()

My question is, how can I check to see if 'localfile' exists on the remote machine before I try the scp?

I'd like to try and use Python commands where possible i.e. not bash

评论

Use paramiko's SFTP client instead. This example program checks for existence before copy.

#!/usr/bin/env python

import paramiko
import getpass

# make a local test file
open('deleteme.txt', 'w').write('you really should delete this]n')

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
    ssh.connect('localhost', username=getpass.getuser(),
        password=getpass.getpass('password: '))
    sftp = ssh.open_sftp()
    sftp.chdir("/tmp/")
    try:
        print(sftp.stat('/tmp/deleteme.txt'))
        print('file exists')
    except IOError:
        print('copying file')
        sftp.put('deleteme.txt', '/tmp/deleteme.txt')
    ssh.close()
except paramiko.SSHException:
    print("Connection Error")

It should be possible to use only paramiko combined with 'test' command to check file existence. This doesn't require SFTP support:

from paramiko import SSHClient

ip = '127.0.0.1'
file_to_check = '/tmp/some_file.txt'

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect(ip)

stdin, stdout, stderr = ssh.exec_command('test -e {0} && echo exists'.format(file_to_check))
errs = stderr.read()
if errs:
    raise Exception('Failed to check existence of {0}: {1}'.format(file_to_check, errs))

file_exits = stdout.read().strip() == 'exists'

print file_exits

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Check whether a path exists on a remote host using paramiko
    Paramiko's SFTPClient apparently does not have an exists method. This is my current implementation: def rexists(sftp, path): """os.path.exists for paramiko's SCP object """ try: sftp.stat(path) except IOError, e: if 'No such file' in str(e): return False raise else: return True Is there a better way to do this? Checking for substring in Exception messages is pretty ugly and can be unreliable.
  • 如何使用SCP或SSH将文件复制到Python中的远程服务器?(How to copy a file to a remote server in Python using SCP or SSH?)
    问题 我的本地计算机上有一个文本文件,该文件由cron中运行的每日Python脚本生成。 我想添加一些代码,以使该文件通过SSH安全地发送到我的服务器。 回答1 您可以使用subprocess.run调用scp bash命令(它通过SSH复制文件): import subprocess subprocess.run(["scp", FILE, "USER@SERVER:PATH"]) #e.g. subprocess.run(["scp", "foo.bar", "joe@srvr.net:/path/to/foo.bar"]) 如果要创建要在同一Python程序中发送的文件,则需要在用于打开文件的with块之外调用subprocess.run命令(或在文件上调用.close()首先,如果您不使用with块),那么您知道它是从Python刷新到磁盘的。 您需要预先生成(在源计算机上)并安装(在目标计算机上)ssh密钥,以便scp自动通过您的公共ssh密钥进行身份验证(换句话说,因此您的脚本不需要输入密码) 。 回答2 要使用Paramiko库在Python中执行此操作(即不通过subprocess.Popen或类似程序包装scp),您将执行以下操作: import os import paramiko ssh = paramiko.SSHClient() ssh.load_host
  • 用于ssh处理的python库(python libraries for ssh handling)
    问题 我将编写第一个代码来处理python上的ssh命令,我在stackoverflow上进行了搜索,可以看到有一些python库可用于处理通过ssh传递的命令,例如paramiko,pexpect以及其他一些库。 特别是,我将需要从远程服务器读取文件的内容,通过ssh / scp复制文件,在远程服务器上启动脚本后从远程服务器获取输出。 也许有些专家可以建议哪种图书馆更好,并说明优缺点? 回答1 库,包装器: http://www.lag.net/paramiko/ #!/usr/bin/env python import paramiko from contextlib import contextmanager host = '192.168.10.142' username = 'slacker' password = 'password' def create_ssh(host=host, username=username, password=password): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: print "creating connection" ssh.connect(host, username=username
  • SSH/SCP 通过 Paramiko 和字符串中的密钥(SSH/SCP through Paramiko with key in string)
    问题 我有一个很棒的 Paramiko Python 脚本来通过 SCP 协议传输文件。 但我需要的是一个没有任何其他文件依赖项的单个文件 (script.py),所以我不想有一个用于我的 SSH 私钥的外部文件。 我想要做的是将私钥嵌入到字符串变量中,并将此变量用作脚本连接所需的文件。 我尝试使用StringIO库,但它似乎不起作用: hostname = '1.1.1.1' # remote hostname where SSH server is running port = 22 username = 'user' password = 'pswd' dir_local='/home/paramikouser/local_data' dir_remote = "remote_machine_folder/subfolder" glob_pattern='*.*' import os import glob import paramiko import md5 import StringIO private_key = StringIO.StringIO('-----BEGIN RSA PRIVATE KEY-----\n-----END RSA PRIVATE KEY-----') def agent_auth(transport, username): """
  • Paramiko scp copy from remote machine regular expression
    Is there way i can copy remote files that ends with name "output" using paramiko scp. I have below code, which copies only if i provide full path or exact file name Below is code import paramiko import os from paramiko import SSHClient from scp import SCPClient def createSSHClient(self, server): client = paramiko.SSHClient() client.load_system_host_keys() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(server, self.port, self.user, self.password) return client def get_copy(self, hostname, dst): ssh = self.createSSHClient(hostname) scp = SCPClient(ssh.get_transport()
  • 在 python 中执行 bash 脚本(Executing a bash script in python)
    问题 我创建了一个 expect 脚本,当执行该脚本时,ssh 会连接到服务器并执行一系列命令。 伪代码如下所示: #!/usr/bin/expect spawn ssh usr@myip expect "password:" send "mypassword\n"; send "./mycommand1\r" send "./mycommand2\r" interact 当从 bash shell ($ ./myscript.txt) 执行时,代码执行良好。 我现在想做的是在 python 文件中有一行,它以与 bash shell 相同的方式运行脚本中的命令。 伪代码如下所示: import subprocess def runmyscript(): subprocess.call("myscript.txt", executable="expect", shell=True) def main(): run = runmyscript(): if __name__ == '__main__': main() 我已将 myscript.txt 脚本文件与 runmyscript.py 文件放在同一目录中,但是当我运行 python 文件时收到错误: WindowsError: [Error 2] The system cannot find the file specified
  • 从远程读取 h5 文件(Read h5 file from remote)
    问题 我有一个问题,我无法从我的服务器读取 h5 文件。 我的服务器上有 ssh,服务器也是本地的。 所以我有两种类型的代码: store1 = pd.HDFStore(os.system("scp newrow_data_copy.h5 lucy@192.168.1.51:media/lucy/hdd1/hdf_row/Archive1")) 错误是预期字节,得到 int。 另外 os.system 说错了,期望的字符串 store1 = pd.HDFStore('//192.168.1.51/media/lucy/hdd1/hdf_row/Archive1/newrow_data_copy.h5', mode='r') 错误:文件不存在。 尽管如此,我还是在服务器上看到了该文件。 出了什么问题,我应该怎么做才能从远程服务器读取 h5 文件。 我无法下载,因为文件足够大。 回答1 您知道读取整个远程文件,顾名思义就是下载,对吗? 是将文件下载到工作内存还是磁盘是完全不同的问题。 话虽如此,除非您愿意编写自己的 tty 模拟器,否则ssh和scp都不会对您有太大帮助,因此只需安装 paramiko 模块并将其用于 Python 中的所有远程 SSH/SFTP 需求。 在你的情况下,这应该这样做: import pandas as pd import paramiko ssh =
  • 如何在python中进行scp?(How to scp in Python?)
    问题 在Python中scp文件的最pythonic方式是什么? 我知道的唯一路线是 os.system('scp "%s" "%s:%s"' % (localfile, remotehost, remotefile) ) 这是一种hack,并且无法在类似Linux的系统之外运行,并且需要Pexpect模块的帮助来避免出现密码提示,除非您已经为远程主机设置了无密码的SSH。 我知道Twisted的conch ,但是我宁愿避免通过低级ssh模块自己实现scp。 我知道paramiko ,它是一个支持SSH和SFTP的Python模块。 但它不支持SCP。 背景:我正在连接到不支持SFTP但支持SSH / SCP的路由器,因此不能选择SFTP。 编辑:这是如何使用SCP或SSH将文件复制到Python中的远程服务器的副本。 但是,该问题并未给出处理来自Python内部键的特定于scp的答案。 我希望找到一种运行类似代码的方法 import scp client = scp.Client(host=host, user=user, keyfile=keyfile) # or client = scp.Client(host=host, user=user) client.use_system_keys() # or client = scp.Client(host=host, user
  • How to get the latest folder that contains a specific file of interest in Linux and download that file using Paramiko in Python?
    I am trying to scp a specific file from a remote server to my local machine using Paramiko in Python 3. Background: There is a directory mydir on the destination machine 198.18.2.2 that contains many timestamp directories that start with the name 2020... Destination machine: 198.18.2.2 Source Machine: 198.18.1.1 So far I have managed to construct the command to be executed as follows - cd "$(ls -1d /mydir/20* | tail -1)"; scp -o StrictHostKeyChecking=no email_summary.log root@198.18.1.1:/mydir/work/logs/email_summary_198.18.2.2.log Code: def remote_execute(dest_ip, cmd): """API to execute
  • 使用本地主机上的python脚本传输文件(scp)并从jumpserver运行命令到finalserver(Transfer file(scp) and run command from jumpserver to finalserver using python script on localhost)
    问题 需要将文件上传到最终服务器,并且需要使用该文件作为输入来运行命令。 以下将是要执行的整个操作的步骤(但我卡在第 3 步): 1 - 将文件从本地主机传输到跳转服务器(使用 scp) 2 - ssh 到跳转服务器 3 - 将文件从 jumpserver 传输到 finalserver(使用 scp) 4 - ssh 到最终服务器 5 - 在 finalserver 上运行命令(使用文件作为输入) try: cmd_str = "scp " + file_path + " " + user + "@" + jumpbox + ":/tmp/" print "---------local to jumpbox initiated:" #print cmd_str child = pexpect.spawn(cmd_str) #-------------------------------------------------------step 1 child.expect("password:") #pwd = raw_input("please enter password along with yubikey:") pwd = getpass.getpass("Enter password along with yubikey:") child.sendline(pwd) i
  • 使用 Python 的 SCPClient 库在文件名中使用通配符(Using wildcards in file names using Python's SCPClient library)
    问题 我想使用 Python 脚本将文件从远程机器复制到我的本地机器。 我只知道文件名的扩展名,所以我想使用通配符来表示文件名。 此外,我想直接使用SCPClient Python 库而不是os.system ,如题为 using wildcards in filename in filename in python in python 中所建议的那样 但是当我运行以下代码时: from paramiko import SSHClient import paramiko from scp import SCPClient with SSHClient() as ssh: ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('10.10.100.5', username= 'root', password='Secret') with SCPClient(ssh.get_transport()) as scp: scp.get(remote_path='/root/*.py', local_path='.') 我得到一个例外 scp.SCPException: scp: /root/*.py: 没有那个文件或目录 从 shell 运行效果很好 scp root@10.10.100.5:/root/
  • ansible自动运维
    https://juejin.im/post/5b3a074d51882548bc3aa35e https://baijiahao.baidu.com/s?id=1650879841344431164&wfr=spider&for=pc 配置文件参考 https://www.cnblogs.com/LuisYang/p/5960660.html playbook详解: https://blog.51cto.com/13630803/2154192 两个核心文件:ansible.cfg和hosts文件,默认都存放在/etc/ansible目录下。 ansible.cfg:主要设置一些ansible初始化的信息,比如日志存放路径、模块、插件等配置信息 hosts:机器清单,进行分组管理 # config file for ansible -- http://ansible.com/ # ============================================== # nearly all parameters can be overridden in ansible-playbook # or with command line flags. ansible will read ANSIBLE_CONFIG, # ansible.cfg in the current
  • 使用Paramiko进行目录转移(Directory transfers with Paramiko)
    问题 您如何使用Paramiko传输完整目录? 我正在尝试使用: sftp.put("/Folder1","/Folder2") 这给了我这个错误- Error : [Errno 21] Is a directory 回答1 您将需要像使用python在本地那样进行此操作(如果您未使用Shutils)。 结合使用os.walk()和sftp.mkdir()和sftp.put() 。 您可能还想使用os.path.islink()检查每个文件和目录,这取决于您是否要解析符号链接。 回答2 您可以继承paramiko.SFTPClient并将其添加以下方法: import paramiko import os class MySFTPClient(paramiko.SFTPClient): def put_dir(self, source, target): ''' Uploads the contents of the source directory to the target path. The target directory needs to exists. All subdirectories in source are created under target. ''' for item in os.listdir(source): if os.path.isfile
  • Using wildcards in file names using Python's SCPClient library
    I want to copy files from remote machine using Python script to my local machine. I only know the extension of the file names so I want to use wildcards to express the file name. In addition, I want to use the SCPClient Python library and not the os.system directly as suggested in the question titled using wildcards in filename in scp in python But when I run the following code: from paramiko import SSHClient import paramiko from scp import SCPClient with SSHClient() as ssh: ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('10.10.100.5', username= 'root', password='Secret'
  • Python 远程连接Linux服务器(一)
    Python 远程连接服务器 一、绪论 在python项目中需要远程操作linux服务器,在服务器上进行文件的拷贝以及linux命令操作。给python安装paramiko 远程连接操作linux服务器是很好的选择。 二、依赖包 在安装paramiko前需要先安装三个依赖包。 1、1 在windows中使用cmd命令安装方式 1、安装依赖包 pip3 install ecdsa pip3 install Crypto pip3 install Twisted 2、安装paramiko pip3 install paramiko 1、2 使用python工具安装 1、在pyCharm工具依次点击:File---setting---Project 2、在Project中找到自己的项目,点击Interpreter 搜索插件,安装 1.3 paramiko 安装完成后,即可编写脚本远程连接。 三、远程ssh连接服务器方式一 第一种方式: 这种方式比较简单,没有进行封装。单纯的实现了远程连接linux服务器。下面还有一种方式,是在这个方式的基础上将每个主要步骤做了封装,方便业务调用。 import paramiko class ConnectShell: def remotConnect(self): # 服务器相关信息,下面输入你个人的用户名、密码、ip等信息 ip = "192.168
  • 在远程服务器上运行本地python脚本(Run local python script on remote server)
    问题 我正在调试一些必须在我的虚拟机上运行的python脚本。 而且,我更喜欢在本地(虚拟机外部)编辑脚本。 因此,我发现每次都将修改后的脚本scp到虚拟机很繁琐。 谁能提出一些有效的方法? 特别是,我想知道是否可以在远程PVM上执行python脚本。 像这样: python --remote user@192.168.1.101 hello.py //**FAKED**, served to explain ONLY 回答1 可以使用ssh。 Python接受连字符(-)作为执行标准输入的参数, cat hello.py | ssh user@192.168.1.101 python - 运行python --help以获得更多信息。 回答2 尽管这个问题不是很新,并且已经选择了答案,但我想分享另一种不错的方法。 使用paramiko库-SSH2的纯python实现-您的python脚本可以通过SSH连接到远程主机,将自身(!)复制到该主机,然后在远程主机上执行该复制。 远程进程的Stdin,stdout和stderr将在您本地运行的脚本中可用。 因此,该解决方案几乎独立于IDE。 在本地计算机上,我使用cmd行参数“ deploy”运行脚本,该脚本触发远程执行。 如果没有这样的参数,则将运行用于远程主机的实际代码。 import sys import os def main()
  • How to scp in Python?
    What's the most pythonic way to scp a file in Python? The only route I'm aware of is os.system('scp "%s" "%s:%s"' % (localfile, remotehost, remotefile) ) which is a hack, and which doesn't work outside Linux-like systems, and which needs help from the Pexpect module to avoid password prompts unless you already have passwordless SSH set up to the remote host. I'm aware of Twisted's conch, but I'd prefer to avoid implementing scp myself via low-level ssh modules. I'm aware of paramiko, a Python module that supports SSH and SFTP; but it doesn't support SCP. Background: I'm connecting to a router
  • 使用Python使用SSH从服务器读取文件(Read a file from server with SSH using Python)
    问题 我正在尝试使用来自Python的SSH从服务器读取文件。 我正在使用Paramiko进行连接。 我可以连接到服务器,并运行类似cat filename的命令,然后从服务器获取数据,但是我尝试读取的某些文件的大小约为1 GB或更大。 如何使用Python在服务器上逐行读取文件? 附加信息:通常执行的是运行cat filename命令并将结果存储在变量中并加以解决。 但是由于这里的文件很大,我正在寻找一种从服务器逐行读取文件的方法。 编辑:我可以读取一堆数据并将其分成几行,但问题是缓冲区中接收的数据并不总是包含完整的行。 例如,如果缓冲区有300行,则最后一行可能仅是服务器上该行的一半,而下一行将在下一次对服务器的调用中获取。 我想要完整的台词 编辑2:我可以使用什么命令来打印文件在一定范围内的行。 像先打印100行,然后再打印100行,依此类推? 这样,缓冲区将始终包含完整的行。 回答1 Paramiko的SFTPClient类允许您获取类似文件的对象,以Python方式从远程文件读取数据。 假设您有一个开放的SSHClient : sftp_client = ssh_client.open_sftp() remote_file = sftp_client.open('remote_filename') try: for line in remote_file: #
  • 在Python中使用SFTP上传文件,但如果路径不存在,则创建目录(Upload files using SFTP in Python, but create directories if path doesn't exist)
    问题 我想使用Python在远程服务器上上传文件。 我想事先检查远程路径是否确实存在,如果不存在,则要创建它。 用伪代码: if(remote_path not exist): create_path(remote_path) upload_file(local_file, remote_path) 我正在考虑在mkdir -p remote_path执行命令来创建路径(例如mkdir -p remote_path )。 我想出了这个: # I didn't test this code import paramiko, sys ssh = paramiko.SSHClient() ssh.connect(myhost, 22, myusername, mypassword) ssh.exec_command('mkdir -p ' + remote_path) ssh.close transport = paramiko.Transport((myhost, 22)) transport.connect(username = myusername, password = mypassword) sftp = paramiko.SFTPClient.from_transport(transport) sftp.put(local_path, remote_path) sftp
  • 通过python在脚本中使用密码ssh到远程机器(ssh to remote machine with password in script via python)
    问题 我正在使用远程机器。 每次我需要验证文件更新时间时,我都必须 ssh,并且有多个脚本可以对远程机器执行 ssh。 我查看了互联网,但无法根据我的要求找到。 我试图找到一个使用 ssh 的 python 脚本,密码也在脚本中,因为我的 python 脚本将每 5 分钟检查一次文件修改时间,并且每次脚本执行时我都无法输入密码。 我从 SO 和互联网上尝试了这些代码,但无法满足我的需求。 通过在python中使用脚本提供密码来建立ssh会话 如何使用python远程执行进程 此外,我只是通过 ssh 进入一台远程机器。然后我试图通过 python 脚本到另一台远程机器,因为这个 python 脚本还包含检查不同文件修改时间的代码..意味着我已经 ssh 到一台远程机器然后我想从那里运行一些 python 脚本,它检查另一台远程机器上文件的文件修改时间。 有没有一种简单的方法来 ssh 远程机器以及 python 脚本中的密码。 . 我将感激不尽。 回答1 如果你想尝试 paramiko 模块。 这是一个示例工作 python 脚本。 import paramiko def start_connection(): u_name = 'root' pswd = '' port = 22 r_ip = '198.x.x.x' sec_key = '/mycert.ppk' myconn