在Python中scp文件的最pythonic方法是什么?我所知道的唯一途径是
os.system('scp "%s" "%s:%s"' % (localfile, remotehost, remotefile) )
Run Code Online (Sandbox Code Playgroud)
这是一个hack,并且在类似Linux的系统之外不起作用,并且需要Pexpect模块的帮助以避免密码提示,除非您已经将无密码SSH设置到远程主机.
我知道Twisted的conch
,但我宁愿避免通过低级ssh模块自己实现scp.
我知道paramiko
,一个支持ssh和sftp的Python模块; 但它不支持scp.
背景:我正在连接到不支持sftp但支持ssh/scp的路由器,所以sftp不是一个选项.
编辑:这是如何使用SCP或SSH将文件复制到Python中的远程服务器?. 但是,这个问题没有给出一个scp特定的答案来处理python中的键.我希望有一种运行代码的方式
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=user, password=password)
# and then
client.transfer('/etc/local/filename', '/etc/remote/filename')
Run Code Online (Sandbox Code Playgroud) 我在本地计算机上有一个文本文件,它由在cron中运行的每日Python脚本生成.
我想添加一些代码,以便通过SSH将该文件安全地发送到我的服务器.
我需要将所有.class文件从服务器复制到本地,并保留所有目录.例如,server:/usr/some/unknown/number/of/sub/folders/me.class
将/usr/project/backup/some/unknown/number/of/sub/folders/me.class
可问题是,有很多其他的无用文件,例如我不想.svn文件,基本文件.我怎么能过滤它们所以我只有scp
.class文件?
我想scp
使用 PRIVATE_KEY 在 GitLab 管道中复制数据。
错误是:
kex_exchange_identification: read: Connection reset by peer
Connection reset by x.x.x.x port 22
lost connection
Run Code Online (Sandbox Code Playgroud)
管道日志:
$ mkdir -p ~/.ssh
$ echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa
$ eval "$(ssh-agent -s)"
Agent pid 22
$ ssh-add ~/.ssh/id_rsa
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
$ ssh-keyscan -H $IP >> ~/.ssh/known_hosts
# x.x.x.x:22 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.10
# x.x.x.x:22 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.10
$ scp -rv api.yml root@$IP:/home/services/test/
Executing: program /usr/bin/ssh host x.x.x.x, user root, …
Run Code Online (Sandbox Code Playgroud) 我试图通过VPN使用SSH将本地计算机上的本地文件"magento.tar.gz"复制到远程服务器.这是连接到虚拟机的内部IP,我在这里用作xx.xxxx.
我在SSH帐户上拥有完整的"sudo"访问权限,因此复制过程中不会出现任何问题.我尝试过以下方法:
我尝试了以下(magento.tar.gz文件已经在本地根目录)
sudo scp magento.tar.gz user@xx.x.x.xx/var/www/
Run Code Online (Sandbox Code Playgroud)
这要求我输入我的本地密码.然后返回cp: user@xx.x.x.xx/var/www: Not a directory
sudo scp /Users/myname/magento.tar.gz user@xx.x.x.xx/var/www/
Run Code Online (Sandbox Code Playgroud)
返回相同.
我是否需要在任何地方都包含SSH?
我是否需要先通过SSH连接到该站点?
旁注:我已经设法通过SSH连接到服务器,浏览到目录并创建一个文件夹并使用sudo mkdir
等删除它所以我绝对有权限.
我的unix系统上的目录中有n个文件.有没有办法编写一个shellcript,将所有这些文件通过scp传输到指定的远程系统.我将在脚本中指定密码,这样我就不必为每个文件输入密码.
通过Java编程语言执行scp传输的最佳方法是什么?我似乎可以通过JSSE,JSch或充气城堡java库来执行此操作.这些解决方案似乎都没有一个简单的答案.
我用scp shell命令复制文件的大文件夹.
但在某些时候我不得不杀死运行命令(通过Ctrl + C或kill).
我理解scp按顺序复制文件,所以应该只有一个部分复制的文件.
如何恢复相同的scp命令以不覆盖成功复制的文件并正确处理部分复制的文件?
PS我知道我可以在rsync中做这种事情,但是由于某些原因scp对我来说更快,我用它代替.
我想知道是否有办法通过remote1主机直接从我的本地机器上通过remote2主机获取SCP文件.
网络仅允许从remote1主机连接到remote2主机.此外,remote1主机和remote2主机都不能scp到我的本地计算机.
是否有类似的东西:
scp user1@remote1:user2@remote2:file .
第一个窗口:ssh remote1
然后scp remot2:file .
.
第二壳: scp remote1:file .
第一窗口: rm file; logout
我可以写一个脚本来完成所有这些步骤,但如果有直接的方法,我宁愿使用它.
谢谢.
编辑:我正在考虑打开SSH隧道,但我很困惑什么值放在哪里.
目前,要访问remote1
,我在$HOME/.ssh/config
本地计算机上有以下内容.
Host remote1
User user1
Hostname localhost
Port 45678
Run Code Online (Sandbox Code Playgroud)
一旦打开remote1
,要访问remote2
,它是标准的本地DNS和端口22.我应该放置remote1
和/或更改localhost
什么?