שאלה כיצד ניתן לבצע העברות SCP של Multihop?


אני רוצה להעתיק קובץ מהמכונה שלי לשרת C, אבל יש רק גישה לשרת C באמצעות שרת ב.

במקום להעביר תחילה לשרת B, להיכנס ולאחר מכן להעביר לשרת C, האם ניתן להעביר את הקובץ ישירות עם SCP או תוכניות דומות?

(Emacs tramp-mode יש תכונה זו עבור עריכת קבצים מרחוק).


76
2017-07-08 12:09






תשובות:


בהנחה ש- OpenSSH, הוסף לתצורת SSH ב- .ssh / config

Host distant
ProxyCommand ssh near nc distant 22

זה יגרום SSH כדי להיות מסוגל להתחבר "ישירות" למכונה בשם מרוחק על ידי proxying דרך המכונה הקרובה. לאחר מכן הוא יכול להשתמש ביישומים כמו scp ו- sftp למכונה המרוחקת.

בשביל זה לעבוד אתה צריך 'nc' aka netcat מותקן על המכונה הקרובה. אבל הרבה מערכות מודרניות יהיה כבר את זה.

הפתרון של זפת של טו הוא יעיל יותר עבור one-shot בעיות, בהנחה שיש לך לזכור את התחביר של זפת ואת כללי הפעולה.


43
2017-07-08 12:25



זוהי אותה שיטה שבה אני משתמש ... בדוגמה זו 'רחוק' יהיה שרת C ו 'ליד' יהיה שרת ב להבהרה ... - Jeremy Bouse
הרבה מכונות מודרניות אין 'nc': זה בדרך כלל זמין רק לינוקס מכונות רק על פי בקשה (לא חלק התקנה רגילה). - Mei
ssh יש עכשיו -W אפשרות, זה עושה את זה באופן אוטומטי ללא nc, אבל אני תוהה למה אין scp -W - kubanczyk
במקרה שאני לא היחיד זה לא היה ברור: אם שם המשתמש ב near שונה מ שם המשתמש ב distant, המשתמש הקרוב נכנס ProxyCommand ssh nearuser@near..., והמשתמש המרוחק נכנס אל נפרד User distantuser קו. - Mu Mind
פשוט להקליד ssh רב תקווה ולחץ על Google אני מרגיש בר מזל - chandank


אתה יכול להוסיף -o אופציות scp במקום .ssh/config.

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host הוא שלך "שרת B" במקרה זה.


41
2018-01-11 17:30



זאת הדרך המועדפת שלי לעשות את זה. מבולבל. Ssh / config עבור multihopping אינו הפתרון הטוב ביותר אם אתה מקבל את אותו מארח או משער ישירות. - GabrieleV
איך זה יהיה עם שמות משתמש שונים / מותאמים אישית יציאות? - Pablo Bianchi


עם גרסאות האחרונות יותר של ssh על השרת ליד (B) מכונה הבאה תפעל ללא netcat:

Host distant
    ProxyCommand ssh near -W distant:22

זה יהיה עם זאת דורשים AllowTcpForwarding להיות כן (ברירת המחדל) על ליד (ב) מכונה

עריכה: דורש OpenSSH 5.4+ על B


19
2018-03-20 01:04



עובד כמו קסם :) - gongzhitaao
וגם של OpenSSH 7.4p1 לכל הפחות, יש פקודה "ProxyJump" שבו אחד בלבד יש רשימה של כל משתמש @ מארח: יציאה מופרדת עם פסיקים. נחמד! - hmijail
ProxyJump הוא נחמד, אבל זה לא לקח את המשתמש ואת IdentityFile מקובץ config. ProxyCommand -W עושה את זה וגם עובד עם scp. - rickfoosusa


אתה יכול ssh לשרת B באמצעות משהו כמו

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

אז אתה יכול ssh לשרת C באמצעות

ssh -p 5022 <user_serverC>@localhost 

באופן דומה scp יעבוד באמצעות

scp -P 5022 foo.txt <user_serverc>@localhost:

זכור להשתמש במקרה הנכון של p עם scp ו- ssh


15
2017-07-08 13:02





אם אתה רוצה להיות ממש מרושע, אתה יכול שרשרת ssh ו זפת, משהו כמו tar c mydir | ssh server "ssh otherserver | tar x", אבל זה יכול לרוץ לתוך כל הידיים של בעיות.

הדרך הקלה תהיה רק ​​כדי להגדיר מנהרה SSH עם מובנית שיטות של SSH; להסתכל על -D לעבור את manpage ופשוט קדימה כמה יציאת יציאת ssh של שרת אחר.


3
2017-07-08 12:16





זה אפשרי וקל יחסית, גם כאשר אתה צריך להשתמש אישורים לאימות (אופייני בסביבות AWS).

הפקודה הבאה תעתיק קבצים מ remotePath on server2 תיאטרון me localPath. פנימי הבקשה SCP הוא proxied דרך server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

ההפך הוא גם עובד (להעלות קובץ):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

אם אתה משתמש באימות סיסמה במקום זאת, נסה עם

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

אם אתה משתמש באותם אישורי משתמש בשני השרתים:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

3
2017-10-08 01:24





אתה יכול גם לעשות את זה הפוך ואולי קל יותר.

נניח שיש לך ssh הפעלה נפתח עם המכונה אתה רוצה לשלוח את הקובץ. ללא שם: מחשב זה רחוק-הופ, אנו קוראים לזה hop2. מארח "proxy" שלך יהיה hop1. המחשב שמקורו בקובץ, נקרא למקור זה.

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

באפשרותך לבנות מנהרות שהופכות יציאה מקומית לזמינה במחשב מרוחק. לכן אנו מגדירים יציאה לפתיחת המחשב המרוחק, אשר יהיה הפנייה מחדש ליציאה ששלחת איתכם בעת בניית המנהרה.

ב- hop2:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

עכשיו במפגש פתח מנהרה, אתה יכול לעשות את אותו הדבר מ hop1 ל file_origin.

On hop1:

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

אתה עכשיו מנהרה מ hop2 כדי hop1 למקור. במקרה, עכשיו הן יציאה 5555 ו 6666 פתוחים על המקור, אשר מפנה ליציאה של hop2 22. בתוך הפגישה הזו, הן הבאות נתיבי SC חוקי כדי hop2:

על מקור:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

בדרך זו, אתה יכול להיות מספר שרירותי של כשות בין לבין, וזה קל יותר לעבוד עם במונחים של שרשור יחד יותר משתי כשות.


2
2017-11-18 20:22





נסה לערבב את התצורה OpenSsh בדוגמה הבאה להתקנה שניתן להשתמש בה עבור מספר מארחים:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

זה מניח קבוצה של שרתים שמתחילים עם "uat-", כי הם נגישים רק באמצעות קופסת / שער שער "מבצר- out". אתה כנראה גם רוצה להוסיף ForwardAgent yes אם אתה משתמש במפתח כדי להתחבר.


1
2018-06-25 10:33



אין להשתמש ForwardAgent yes לזה. העברת סוכן אינו נחוץ במקרה זה כי הלקוח לא ssh יפעל על הבסטיון, והעברת סוכן כאשר הוא לא נחוץ הוא רק הולך להפחית את האבטחה. ואני חושב ssh חסר בפקודה שלך. אם לאחרונה ssh הגירסה נמצאת בשימוש אתה לא צריך nc, אתה יכול להקליד ssh -W %h:%p bastion-uat במקום זאת. - kasperd
@ kasperd נערך כדי לכלול ssh. Reward קדימה; לקוח ssh יפעל על מנת להפעיל את הפקודה nc עצמה. אולי אתה מתכוון לקליפה? - Benjamin Goodacre


זה לא scp (אשר OP המבוקש), אבל מצאתי את זה סופר פשוט לשימוש rsync להעתיק מ מקומי ל מרוחק על פני הופ אחד עם:

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

מקור: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

ניסיתי את proxyPass הצעה לעיל לא רוצה לשנות את התצורה לצרכים המשתנים שלי. כפי שכותב המחבר בקישור לעיל, קובץ היעד שקודם לקולון (:) חשוב לציין את הנתיב שצוין בשרת היעד. כמו כן, באמצעות rsync, יש לך את האפשרויות של תאריך להשוות, סינכרון התיקייה, וכו 'אני מקווה שזה עוזר למישהו!


1
2017-12-21 17:07