我从本地计算机与远程服务器上的ssh连接。
我在远程服务器上运行Snakemake。
我想用作本地计算机上文件的规则输入。
当然,由于我在服务器上运行Snakemake,因此服务器成为本地计算机,而本地计算机成为远程计算机(对于Snakemake)。

from snakemake.remote.SFTP import RemoteProvider

# I am not sure about the private key, is it the one I have on the server ?
# I have the same result with or without private_key anyway

# SFTP = RemoteProvider(port=22, username="myusername", private_key="/path/to/.ssh/id_rsa")
SFTP = RemoteProvider(port=22, username="myusername")

configfile : "config.json"

localrules: copyBclLocalToCluster

rule all:
    input:
        "copycluster.txt"

rule copyBclLocalToCluster:
    input:
        SFTP.remote("adress:path/to/filelocal.txt")
    output:
        "copycluster.txt"
    shell:
        "scp {input} {output}"

-----------------------------------------
Building DAG of jobs...
MissingInputException in line 26 of /path/to/Snakefile:
Missing input files for rule copyBclLocalToCluster:
adress:path/to/filelocal.txt



医生说该端口不应该是22号端口,但是为什么呢?我真的很想使用它,因为我不知道如何配置另一个端口,而且我什至不确定是否拥有这样做的权利。

真的是港口问题吗?或者我只是不了解如何在Snakemake中使用SFTP。

将本地计算机上的文件用作蛇形输入的最佳方法是什么?

编辑

这不是端口问题,我什至不需要指定端口号,因为它是端口22。
我试图指定好的ssh私钥:
SFTP = RemoteProvider(port=22, username="myusername", private_key="/path/to/.ssh/id_rsa")
-----------------------------
Building DAG of jobs...
MissingInputException in line 26 of /path/to/Snakefile:
Missing input files for rule copyBclLocalToCluster:
adress:path/to/filelocal.txt

如果我在服务器上的控制台上尝试sftp myusername@adress:path/to/filelocal.txt .,则可以正常工作。

为什么在snakemake中不起作用?

编辑

当我尝试在remoteProvider中使用密码而不是ssh-key时,出现相同的错误。
SFTP = RemoteProvider(port=22, username="myusername", password="mypassword")
--------------------------------
Building DAG of jobs...
MissingInputException in line 26 of /path/to/Snakefile:
Missing input files for rule copyBclLocalToCluster:
adress:path/to/filelocal.txt

我确定地址,用户名,密码,ssh-key是正确的并且文件存在,我可以在snakemake之外做到这一点,使其工作正常。

编辑

由于RemoteProvider使用pysftp,因此我尝试在pysftp脚本中使用python复制相同的文件。
import pysftp
with pysftp.Connection(adress,
                       username="myusername",
                       private_key_pass="/path/to/.ssh/id_rsa") as sftp:
    sftp.get(path/to/filelocal.txt, /path/on/cluster/fileCOPY.txt)

它可以正常工作,所以问题肯定来自我的Snakefile。

编辑
RemoteProvider也需要ftputil,我在python脚本中尝试了ftputil。
import ftputil
with ftputil.FTPHost("adress", "myusername", "mypassword") as ftp_host:
    print(getcwd())
    ftp_host.download(remote_path, local_path)
----------------------------------------------
Traceback (most recent call last):
  File "/work/username/miniconda3/envs/RNAseq_snakemake/lib/python3.6/site-packages/ftputil/host.py", line 129, in _make_session
    return factory(*args, **kwargs)
  File "/work/username/miniconda3/envs/RNAseq_snakemake/lib/python3.6/ftplib.py", line 117, in __init__
    self.connect(host)
  File "/work/username/miniconda3/envs/RNAseq_snakemake/lib/python3.6/ftplib.py", line 152, in connect
    source_address=self.source_address)
  File "/work/username/miniconda3/envs/RNAseq_snakemake/lib/python3.6/socket.py", line 724, in create_connection
    raise err
  File "/work/username/miniconda3/envs/RNAseq_snakemake/lib/python3.6/socket.py", line 713, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [Errno 111] Connection refused

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "sftptest.py", line 16, in <module>
    with ftputil.FTPHost("adress", "myusername", "mypassword") as ftp_host:
  File "/work/username/miniconda3/envs/RNAseq_snakemake/lib/python3.6/site-packages/ftputil/host.py", line 69, in __init__
    self._session = self._make_session()
  File "/work/username/miniconda3/envs/RNAseq_snakemake/lib/python3.6/site-packages/ftputil/host.py", line 129, in _make_session
    return factory(*args, **kwargs)
  File "/work/username/miniconda3/envs/RNAseq_snakemake/lib/python3.6/site-packages/ftputil/error.py", line 146, in __exit__
    raise FTPOSError(*exc_value.args, original_exception=exc_value)
ftputil.error.FTPOSError: [Errno 111] Connection refused
Debugging info: ftputil 3.2, Python 3.6.7 (linux)

可能有问题吗?但是我在snakemake中没有这种错误,只是缺少文件错误。我不明白为什么ftputil无法正常工作。

最佳答案

因此,我在Snakemake的源代码中进行了快速又肮脏的搜索,Snakemake使用了ftputil,它需要用户名和密码。当您不提供Snakemake的ssh-key路径时,此密码将默认为None,然后将其传递给ftputil

参见Snakemake source

我同意默认行为应默认为更合理的东西,例如~/.ssh/id_rsa,但不幸的是,它不是。

关于python - Snakemake:本地计算机上的SFTP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60507650/

10-13 05:19