Snakemake: SFTP на локальной машине - PullRequest
2 голосов
/ 03 марта 2020

Я подключен с s sh на удаленном сервере с моей локальной машины.
Я запускаю 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

https://snakemake.readthedocs.io/en/stable/snakefiles/remote_files.html
Адреса удаленных файлов должны быть указаны с хостом (доменом или IP-адресом) и абсолютным путем к файлу на удаленном сервере. Порт можно указать, если демон S SH на сервере прослушивает порт, отличный от 22, либо в RemoteProvider, либо в каждом экземпляре remote ():

Do c говорит, что порт не должен быть портом 22, но почему? Я действительно хотел бы использовать его, так как я не знаю, как настроить другой порт, и я даже не уверен, что у меня есть права на это.

Это действительно проблема с портом? Или я просто не понимаю, как использовать SFTP со Snakemake.

Каков наилучший способ использовать файл на моем локальном компьютере в качестве ввода моего змеиного мейкера?


РЕДАКТИРОВАТЬ

Проблема не в порте, мне даже не нужно его указывать, потому что это порт 22.
Я попытался указать хороший закрытый ключ s sh:

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 . на моей консоли на сервере, он будет работать нормально.

Почему это не работает внутри змеиного мейкера?


РЕДАКТИРОВАТЬ

Когда я пытаюсь использовать свой пароль вместо ключа s sh в remoteProvider у меня та же ошибка.

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

Я уверен, что адрес, имя пользователя, пароль, ключ s sh правильный и файл существует, я могу сделать это вне 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, я пробовал ftputil в python сценарии.

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)

Может ли это быть проблемой? Но у меня нет такого рода ошибок в змейке, просто отсутствует ошибка файла. Я не понимаю, почему не работает ftputil.

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Когда вы используете SFTP на консоли, вы должны написать

sftp myusername@adress:/path/to/file .

Но в удаленной функции Snakemake вы должны удалить «:» между хостом и путем к файлу.
Я был введен в заблуждение по синтаксису SFTP, но это было хорошо написано в snakemake do c

# example from snakemake doc
SFTP.remote("example.com/path/to/file.bam")

# what I was doing badly
SFTP.remote("adress:path/to/filelocal.txt")

Правильная команда:

from snakemake.remote.SFTP import RemoteProvider
SFTP = RemoteProvider(port=22, username="myusername", password="mypassword")
rule all:
    input:
        # "/" instead of ":" between host and the path of the file
        SFTP.remote("adress/path/to/filelocal.txt") 
1 голос
/ 04 марта 2020

Итак, я сделал быстрый и грязный поиск в исходном коде Snakemake, и Snakemake использует ftputil, который требует имя пользователя и пароль. Если вы не указали в качестве ключа sh путь к Snakemake, этот пароль будет по умолчанию установлен на None, который затем будет передан ftputil.

См. Источник Snakemake .

Я согласен с тем, что поведение по умолчанию должно по умолчанию принимать что-то более разумное, например ~/.ssh/id_rsa, но, к сожалению, это не так.

...