Jaki jest najbardziej pythonowy sposób scp pliku w Pythonie? Jedyna trasa, jaką znam, to
os.system('scp "%s" "%s:%s"' % (localfile, remotehost, remotefile) )
co jest hackem i które nie działa poza systemami podobnymi do Linuksa i które wymaga pomocy modułu Pexpect, aby uniknąć monitów o hasło, chyba że masz już skonfigurowane SSH bez hasła na zdalnym hoście.
Jestem świadomy istnienia Twisted conch
, ale wolałbym uniknąć samodzielnego wdrażania scp za pomocą niskopoziomowych modułów ssh.
Jestem świadomy paramiko
, moduł Pythona, który obsługuje SSH i SFTP; ale nie obsługuje SCP.
Tło: Łączę się z routerem, który nie obsługuje SFTP, ale obsługuje SSH / SCP, więc SFTP nie jest opcją.
EDYCJA : To jest duplikat Jak skopiować plik na zdalny serwer w Pythonie przy użyciu SCP lub SSH? . Jednak to pytanie nie daje odpowiedzi specyficznej dla SCP, która dotyczy kluczy z Pythona. Mam nadzieję na sposób na uruchomienie kodu
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')
scp
kończy się wywołaniemscp
wiersza poleceń, który działa tylko na * nix.scp -t
lubscp -f
(tryby „do” i „z”, które istnieją dla tego celu po stronie serwera). W zasadzie tak działa scp - opiera się na innej kopii scp istniejącej na serwerze. Ten artykuł wyjaśnia to bardzo dobrze: blogs.oracle.com/janp/entry/how_the_scp_protocol_worksimport paramiko
from scp import SCPClient
2. Oto przykład polecenia scp.get ():scp.get(r'/nfs_home/appers/xxxx/test2.txt', r'C:\Users\xxxx\Desktop\MR_Test')
pip install scp
w wersji 0.10.2 w chwili pisania tego tekstu.Możesz być zainteresowany wypróbowaniem Pexpect ( kod źródłowy ). Umożliwiłoby to obsługę interaktywnych monitów o podanie hasła.
Oto fragment przykładowego użycia (dla ftp) z głównej strony internetowej:
źródło
Możesz też sprawdzić paramiko . Nie ma (jeszcze) modułu scp, ale w pełni obsługuje sftp.
[EDYCJA] Przepraszam, przegapiłem linię, w której wspomniałeś o paramiko. Poniższy moduł jest po prostu implementacją protokołu scp dla paramiko. Jeśli nie chcesz używać paramiko lub conch (jedynych znanych mi implementacji ssh dla Pythona), możesz przerobić to tak, aby uruchamiało się przez zwykłą sesję ssh przy użyciu potoków.
scp.py dla paramiko
źródło
Nie można znaleźć prostej odpowiedzi, a ten moduł „scp.Client” nie istnieje. Zamiast tego mi odpowiada:
źródło
jeśli zainstalujesz putty na win32, otrzymasz pscp (putty scp).
więc możesz użyć hackowania os.system również na win32.
(i możesz użyć agenta szpachlówki do zarządzania kluczami)
przepraszam, to tylko hack (ale można to opakować w klasę Pythona)
źródło
Możesz użyć podprocesu pakietu i wywołania polecenia, aby użyć polecenia scp z powłoki.
źródło
Na dzień dzisiejszy prawdopodobnie najlepszym rozwiązaniem jest
AsyncSSH
https://asyncssh.readthedocs.io/en/latest/#scp-client
źródło
Spójrz na fabric.transfer .
źródło
Minęło sporo czasu, odkąd zadano to pytanie, a tymczasem pojawiła się kolejna biblioteka, która może sobie z tym poradzić: Możesz użyć funkcji kopiowania zawartej w bibliotece Plumbum :
źródło
SshMachine
ma dostęp dossh-agent
, więc jeśli chcesz po prostu uniknąć wpisywania go za każdym razem, to jest jeden ze sposobów, aby to zrobić. Możesz również zgłosić prośbę o dodanie funkcji na stronie github plumbum.Jeśli korzystasz z * nix, możesz użyć sshpass
źródło
źródło
Hmmm, być może inną opcją byłoby użycie czegoś takiego jak sshfs (jest też sshfs dla Maca). Po zamontowaniu routera możesz po prostu skopiować pliki. Nie jestem pewien, czy to działa w twojej konkretnej aplikacji, ale jest to fajne rozwiązanie, które warto mieć pod ręką.
źródło
Jakiś czas temu stworzyłem skrypt kopiujący SCP w Pythonie, który zależy od paramiko. Zawiera kod do obsługi połączeń z kluczem prywatnym lub agentem klucza SSH z możliwością powrotu do uwierzytelniania hasłem.
http://code.activestate.com/recipes/576810-copy-files-over-ssh-using-paramiko/
źródło
Nie wydaje mi się, aby istniał jeden moduł, który można łatwo pobrać, aby zaimplementować scp, jednak może się przydać: http://www.ibm.com/developerworks/linux/library/l-twist4.html
źródło