Scp සමඟ root ප්‍රවේශය අවශ්‍ය ගොනු පිටපත් කරන්නේ කෙසේද?


178

මා සතුව උබුන්ටු සේවාදායකයක් ඇත, මා සම්බන්ධ කරන්නේ SSH භාවිතා කරමිනි.

මගේ යන්ත්‍රයෙන් /var/www/ලිපිගොනු සේවාදායකයට උඩුගත කිරීමට මට අවශ්‍යය , එහි ඇති ගොනු /var/www/අයිති rootවේ.

පුට්ටි භාවිතා කරමින්, මම ලොග් වූ පසු, sudo suලිපිගොනු වෙනස් කිරීමට හැකිවීම සඳහා පළමුව මගේ මුරපදය ටයිප් කළ යුතුය /var/www/.

නමුත් මම WinSCP භාවිතයෙන් ලිපිගොනු පිටපත් කරන විට, මට ගොනු සෑදීම / වෙනස් කිරීම කළ නොහැක /var/www/, මන්ද මා සම්බන්ධ කරන පරිශීලකයාට ලිපිගොනු සඳහා අවසර නොමැති අතර ssh සැසියකදී මෙන් මට /var/www/කිව නොහැක. sudo su.

ඔබ දන්නවාද මට මෙය සමඟ කටයුතු කරන්නේ කෙසේද?

මම මගේ දේශීය යන්ත්‍රයේ වැඩ කරන්නේ නම්, මම අමතන්නෙමි, gksudo nautilusනමුත් මේ අවස්ථාවේ දී මට ඇත්තේ යන්ත්‍රයට පර්යන්ත ප්‍රවේශය පමණි.


මෙය ඔබගේ අථත්ය සේවාදායක සැපයුම්කරුට හෝ පුට්ටි හෝ වින්ස්ක්පී සංවර්ධකයින්ට ප්‍රශ්නයක් සේ පෙනේ.
dobey

7
ඔබ වැරදියට වැරදියි නම්, එය උබුන්ටු වරප්‍රසාද ගැන ය!
ඩිමිට්‍රිස් සපිකාස්

8
මෙය වසා ඇත්තේ ඇයි? මෙය scp සමඟ ලිපිගොනු පිටපත් කිරීම පිළිබඳ පරිපූර්ණ වලංගු ප්‍රශ්නයකි - සෑම වෙබ් සංවර්ධකයෙක්ම මෙම තත්වය හුරුපුරුදුය
Sergey


මට සමාන ගැටලුවක් තිබේ. මම වින්ඩෝස් පරිගණකයේ ගොනුවක් (මෙම අවස්ථාවේදී HTML) නිර්මාණය කර එය WinSCP සමඟ / var / www / html / වෙබ් අඩවි ෆෝල්ඩරයට පිටපත් කිරීමට උත්සාහ කරමි. අවසර ප්‍රශ්නයක් ඇති බව එහි සඳහන් වේ. මගේ / නිවාස ෆෝල්ඩරයට පිටපත් කළ හැකි නිසා මම ගොනුව පියවර දෙකකින් පිටපත් කළෙමි, නමුත් එය එතරම් පහසු නැත :-) මම මගේ පරිශීලකයා www-data කණ්ඩායමට එක් කිරීමට උත්සාහ කළ නමුත් එය උදව් කළේ නැත. Www-data සමූහයට අයත් ගොනුවක් ෆෝල්ඩරයට පිටපත් කිරීමට පරිශීලකයාට තවමත් ඉඩ නොදෙන්නේ ඇයි?
JanesKranjski

Answers:


132

ඔබ හරි, sudoවැඩ කරන විට නැත scp. මෙහි ප්‍රති ar ලයක් ලෙස scpඔබේ පරිශීලකයාට ලිපිගොනු නිර්මාණය කිරීමට අවසර ඇති නාමාවලියකට ගොනු උඩුගත කිරීම, පසුව ssh හරහා ලොග් වී sudoගොනු ඔවුන්ගේ අවසාන ගමනාන්තයට ගෙනයාමට / පිටපත් කිරීමට භාවිතා කිරීම.

scp -r folder/ user@server.tld:/some/folder/you/dont/need/sudo
ssh user@server.tld
 $ sudo mv /some/folder /some/folder/requiring/perms 
# YOU MAY NEED TO CHANGE THE OWNER like:
# sudo chown -R user:user folder

තවත් විසඳුමක් වනුයේ ඔබ ලිපිගොනු උඩුගත කරන නාමාවලි වල අවසර / හිමිකාරිත්වය වෙනස් කිරීමයි, එබැවින් ඔබේ වරප්‍රසාද නොලත් පරිශීලකයාට එම නාමාවලි වලට ලිවීමට හැකිය.

පොදුවේ ගත් කල, rootගිණුමේ වැඩ කිරීම ව්‍යතිරේකයක් විය යුතුය, රීතියක් නොවේ - ඔබ ඔබේ ප්‍රශ්නය වාක්‍ය ඛණ්ඩනය කරන ආකාරය මා සිතන්නේ ඔබ එය තරමක් අපයෝජනය කරන බවත්, එමඟින් අවසරයන් සමඟ ගැටලු ඇති වන බවත්ය - සාමාන්‍ය තත්වයන් යටතේ ඔබට අවශ්‍ය නොවේ ඔබගේම ලිපිගොනු වෙත ප්‍රවේශ වීමට සුපිරි පරිපාලක වරප්‍රසාද.

තාක්ෂණික වශයෙන්, ඔබට දුරස්ථව පිවිසීමට සෘජුවම ඉඩ දීම සඳහා උබුන්ටු වින්‍යාසගත කළ හැකිය root, නමුත් මෙම අංගය හේතුවක් නිසා අක්‍රීය කර ඇත, එබැවින් එසේ කිරීමට එරෙහිව මම ඔබට තරයේ අවවාද කරමි.


මට පළමු විසඳුම නොලැබුණි, කරුණාකර ඔබට වඩාත් විචිත්‍රවත් විය හැකිද?
ඩිමිට්‍රිස් සපිකාස්

මම අදහස් කරන්නේ මගේම ලිපිගොනු / var / www, මම මගේ vps වෙබ් සේවාදායකය ලෙස භාවිතා කරමි .... මගේම ෆෝල්ඩරයක මට පූර්ණ ප්‍රවේශය ඇත
ඩිමිට්‍රිස් සපිකාස්

7
නැවත. පළමු විසඳුම. 1. scp -R mysite dimitris@myserver.com:/home/dimitris/2. ssh dimitris@myserver.com3. sudo mv ~/mysite /var/www- එය 2-පියවර ක්රියාවලිය, ඔබ ප්රථම scpගොනු ඔබගේ නිවසේ හිස් තීරුවෙහි, එවිට ඔබ හට ssh සහ පිටපත් හරහා ලොග් / ඔවුන් සිටිය යුතු තැන වෙත ගොනු
සර්ජි

43

ඉක්මන් මාර්ගය

සේවාදායකයේ සිට දේශීය යන්ත්‍රය දක්වා:

ssh user@server "sudo cat /etc/dir/file" > /home/user/file

දේශීය යන්ත්‍රයේ සිට සේවාදායකය දක්වා:

cat /home/user/file | ssh user@server "sudo tee -a /etc/dir/file"

7
මෙම පිළිතුර අවතක්සේරු කර ඇත. එය සරල, පිරිසිදු, තනි පරමාණුක මෙහෙයුමක් සහිත මූල ගොනුවක් කියවීම හෝ ලිවීම වන අතර ඔබ scp භාවිතා කරන්නේ නම් එහි සිටින බවට දැනටමත් සහතික කර නොමැති කිසිවක් අවශ්‍ය නොවේ. ප්‍රධානම අඩුපාඩුව නම් එය අවසර පිටපත් නොකිරීමයි. ඔබට එය අවශ්ය නම්, තාර විසඳුම වඩා හොඳය. මෙය ප්‍රබල තාක්‍ෂණයකි, විශේෂයෙන් xargs / bash magic සමඟ
සංචලනය කළහොත්

මම හිතන්නේ ප්‍රශ්නය ගොනුවක් දේශීය සිට දුරස්ථව උඩුගත කිරීම මිස අනෙක් අතට නොවේ
කෝරයිම්

1
ලස්සනට කළා. මෙය හරියටම මම ඉහළ සහ පහළ යන දෙකම සොයමින් සිටියෙමි. ස්තූතියි
ජෙරමි

1
ගොනුවක් වෙනුවට නාමාවලියක් සඳහා මෙය කළ හැකිද?
lucidbrot

1
... නමුත් පූර්වාවශ්‍යතා උපකල්පන ගණනාවක්} හැර-t , ඔබට ssh වෙත යාමට අවශ්‍ය වනු ඇත . එසේ නොමැතිනම් එය දෝෂ සහිත වනු ඇත . සහ ? ප්‍රශ්නය වන්නේ පිටපත් කිරීම ගැන මිස එකතු කිරීම ගැන නොව ඒ සමඟම නැවත stdout වෙත ප්‍රතිරාවය කිරීමයි. sudo: no tty present and no askpass program specifiedtee -a
conny

39

තවත් ක්‍රමයක් වන්නේ scp වෙනුවට tar + ssh භාවිතයෙන් පිටපත් කිරීමයි:

tar -c -C ./my/local/dir \
  | ssh dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"

2
එය කළ හැකි හොඳම ක්‍රමය මෙයයි.
mttdbrd

2
මෙම ක්‍රමය සාර්ථකව ක්‍රියාත්මක කිරීමට මට නොහැකි ය. ලියා ඇති පරිදි මට ලැබෙනවා sudo: sorry, you must have a tty to run sudo. TTY වෙන් කිරීම සඳහා මම "-t" එකතු කළහොත් මට ලැබෙනු Pseudo-terminal will not be allocated because stdin is not a terminal.ඇත. මුරපද රහිත සුඩෝ නොමැතිව මෙය ක්‍රියා කරන ආකාරය මට නොපෙනේ.
IBBoard

1
@ අයිබී බෝඩ්: ssh -t භාවිතා කර මෙහි විසඳුම උත්සාහ කරන්න :ssh -t dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"
ඇලෙක්සැන්ඩර් බර්ඩ්

2
Lex ඇලෙක්සැන්ඩර්බර්ඩ් එය බොහෝ අවස්ථාවන්හිදී ක්‍රියාත්මක වන අතර, එය මෙහි ක්‍රියාත්මක වන බව මට විශ්වාස නැත, මන්ද අපි SSH සම්බන්ධතාවයට ඉහළින් තාර බෝලයක් දැමීමට උත්සාහ කරන බැවිනි. Serverfault.com/questions/14389/…
IBBoard

අවසාන වශයෙන් මට වැඩ කළේ මෙයයි. ඔබ දුරස්ථ ගොනු කිරීමට අවසර ඔබ දේශීය කිරීමට පිටපත් කිරීමට අවශ්ය බව, නැහැ නොමැති sudo tar, එය, වෙනස් අවසර භාවිතා සංරක්ෂණය chmodහා chown, පසුව දේශීය එය පිටපත් කරන්න. විශේෂයෙන් එය නාමාවලියක් නම්.
forumulator

27

මෙය සිදු කිරීම සඳහා ඔබට භාවිතා කළ හැකිය ansible.

Ansible's copymodule භාවිතා කරමින් දුරස්ථ ධාරකයට පිටපත් කරන්න :

ansible -i HOST, -b -m copy -a "src=SRC_FILEPATH dest=DEST_FILEPATH" all

Ansible's fetchමොඩියුලය භාවිතා කර දුරස්ථ ධාරකයෙන් ලබා ගන්න :

ansible -i HOST, -b -m fetch -a "src=SRC_FILEPATH dest=DEST_FILEPATH flat=yes" all

සටහන:

  • -i HOST,වාක්‍ය ඛණ්ඩයේ කොමාව යතුරු ලියනය නොවේ. ඉන්වෙන්ටරි ගොනුවක් අවශ්‍ය නොවී පිළිතුරු සැපයීමේ ක්‍රමය එයයි.
  • -bසේවාදායකයේ ක්‍රියාවන් root ලෙස සිදු කිරීමට හේතු වේ. -bදක්වා විහිදෙන --becomeඅතර පෙරනිමිය --become-userroot වේ, පෙරනිමිය --become-methodsudo වේ.
  • flat=yesගොනුව පමණක් පිටපත් කරයි, ගොනුව වෙත යන දුරස්ථ මාර්ගය පිටපත් නොකරයි
  • ගොනු මාර්ගවල ආදේශක කාඩ්පත් භාවිතා කිරීම මෙම ප්‍රතිචාරාත්මක මොඩියුලයන්ට සහය නොදක්වයි.
  • නාමාවලියක් පිටපත් වේ විසින් සහාය copyමොඩියුලය, නමුත් නොවේ විසින් fetchමොඩියුලය.

මෙම ප්‍රශ්නය සඳහා නිශ්චිත ආයාචනය

මෙන්න ඔබේ උදාහරණයේ නිශ්චිත හා සම්පුර්ණයෙන්ම නිශ්චිතව දක්වා ඇති අතර, බෙදා හැරිය යුතු ලිපිගොනු අඩංගු ඔබේ දේශීය ධාරකයේ නාමාවලිය උපකල්පනය sourcedirකර දුරස්ථ ඉලක්කයේ සත්කාරක නාමය hostname:

cd sourcedir && \
ansible \
   --inventory-file hostname, \ 
   --become \
   --become-method sudo \
   --become-user root \
   --module-name copy \
   --args "src=. dest=/var/www/" \
   all

සංක්ෂිප්ත ආයාචනය සමඟ:

cd sourcedir && \
ansible -i hostname, -b -m copy -a "src=. dest=/var/www/" all

PS, "මෙම අපූරු මෙවලම ස්ථාපනය කරන්න" යැයි පැවසීම යම් ආකාරයක බිහිරි පිළිතුරක් බව මට වැටහී ඇත. නමුත් මම විය ansible සොයා තියෙනවා සුපිරි එසේ ස්ථාපනය එය නියත වශයෙන්ම ඔබ ගොනු යොදවා ඔබ්බට වෙනත් ප්රතිලාභ ගෙන ඇත, දුරස්ථ සේවාදායක පරිපාලක කටයුතු සඳහා ප්රයෝජනවත්.


මම මෙම පිළිතුරට කැමතියි, නමුත් එය විමසීමට පෙර වඩාත් සාමාන්‍ය විවරණයට එදිරිව අසන ලද ප්‍රශ්නයට යොමු කිරීමට මම නිර්දේශ කරමි. වැනි දෙයක්ansible -i "hostname," all -u user --become -m copy -a ...
මයික් ඩී

Ike මයික්: ඉහත වෙනස්කම් පෙනෙන්නේ කෙසේද?
erik.weathers

1
-i 'host,'වලංගු සින්ටැක්ස් වැනි දෙයක් තිබේද? මම හිතන්නේ විධානයක් කියවන විට ඒ වගේ විරාම ලකුණු නැතිවීම පහසුයි. (
පා er කයා

1
@mwfearnley: වග, ෂෙල් සලකන්නේ -i 'host,'හා සමාන -i host,හෝ -i "host,". පොදුවේ ගත් කල, මම මෙම ආයාචනා බිය ගැන්වීමෙන් වළක්වා ගැනීම සඳහා හැකි තරම් කෙටි කාලයක් තබා ගැනීමට කැමැත්තෙමි, නමුත් පැහැදිලි කිරීම සඳහා අවශ්‍ය යැයි ඔබ සිතන පරිදි එය වාචිකව හා පැහැදිලිව ප්‍රකාශ කිරීමට ඔබට නිදහස තිබිය යුතුය.
erik.weathers

2
කොටුවෙන් පිටත සිතීමට යා යුතු මාර්ගය!
Ansible

12

ඔබ ධාවනය කරන විට sudo su, ඔබ සාදන ඕනෑම ලිපිගොනු root සතු වනු ඇත, නමුත් පෙරනිමියෙන් ssh හෝ scp සමඟ root ලෙස සෘජුවම ප්‍රවේශ විය නොහැක. Scp සමඟ sudo භාවිතා කිරීමට ද නොහැකි බැවින් ලිපිගොනු භාවිතා කළ නොහැක. ඔබගේ ලිපිගොනු වල හිමිකම ඉල්ලා සිටීමෙන් මෙය නිවැරදි කරන්න:

ඔබගේ පරිශීලක නාමය ඩිමිට්‍රි යැයි උපකල්පනය කිරීමෙන් ඔබට මෙම විධානය භාවිතා කළ හැකිය.

sudo chown -R dimitri:dimitri /home/dimitri

එතැන් සිට, වෙනත් පිළිතුරු වල සඳහන් පරිදි, "උබුන්ටු" ක්‍රමය වන්නේ සූඩෝ භාවිතා කිරීම මිස මූල පිවිසුම් නොවේ. එය විශාල ආරක්‍ෂිත වාසි සහිත ප්‍රයෝජනවත් ආදර්ශයකි.


මම මෙම විසඳුම ඕනෑම ආකාරයකින් භාවිතා කරමි, නමුත් මට මගේම ගොනු පද්ධතියට පූර්ණ ප්‍රවේශය ලබා ගත හැකි නම්, sudo chow ...සෑම ඩිරෙක්ටරියක් සඳහාම ටයිප් කිරීමට මට අවශ්‍ය නැත : එස්
ඩිමිට්‍රිස් සපිකාස්

2
සියලු පද්ධති ලිපිගොනු වල හිමිකාරිත්වය පහසුව සඳහා පරිශීලකයාට වෙනස් කිරීම අතිශයින් අධෛර්යමත් කරනු ලැබේ. එය ඔබට හමු විය හැකි ඕනෑම පරිශීලක අවකාශ දෝෂයකට ඔබේ පද්ධතියේ ආරක්ෂාව දැඩි ලෙස අඩපණ කිරීමට ඉඩ දෙයි. SCP විසින් ඔබට වෙනස් කිරීමට හෝ යාවත්කාලීන කිරීමට අවශ්‍ය ලිපිගොනු වල හිමිකාරිත්වය වෙනස් කිරීම වඩා හොඳය, නමුත් අනෙක් සියල්ල root සතු වේ (එය එසේ විය යුතුය). ඒ මහතා -Rතුළ chownඇත්තෙන් වෙනසට භාජනය එම බහලුම අයිතිය වෙනස් කිරීමට එය පවසනවා, සහ සියලු දරුවන් ගොනු සහ බහලුම් ... ඔබ මේ වගේ දෙයක් කරන්න පුළුවන් නිසා.
ට්‍රොග්නන්ඩර්ස්

හ්ම් .... එය හොඳින් ක්‍රියාත්මක වන බව පෙනේ, ස්තූතියි! කණගාටුයි මට ඉහළට ඔසවා තැබිය නොහැක (පද්ධතිය මට එය කිරීමට ඉඩ නොදේ ...)
ඩිමිට්‍රිස් සපිකාස්

12

විය හැකි හොඳම ක්රමය භාවිතා කිරීමයි rsync( Cygwin / cwRsync SSH කට Windows හි)?

උදාහරණයක් ලෙස, අයිතිකරු සමඟ ගොනු උඩුගත කිරීමට www-data:

rsync -a --rsync-path="sudo -u www-data rsync" path_to_local_data/ login@srv01.example.com:/var/www

ඔබේ නඩුවේදී, ඔබට මූල වරප්‍රසාද අවශ්‍ය නම්, විධානය මේ ආකාරයෙන් වනු ඇත:

rsync -a --rsync-path="sudo rsync" path_to_local_data/ login@srv01.example.com:/var/www

බලන්න: sudo සමඟ දුරස්ථ සේවාදායකයට scp කරන්න .


5

ඔබ පුට්ටි වෙනුවට OpenSSH මෙවලම් භාවිතා කරන්නේ නම්, ඔබට scpසේවාදායකයේ ගොනු හුවමාරුව ආරම්භ කිරීමෙන් මෙය කළ හැකිය sudo. sshdඔබේ දේශීය යන්ත්‍රය තුළ ඩීමන් ධාවනය වන බවට වග බලා ගන්න . ssh -Rඔබ සමඟ ඔබේ යන්ත්‍රය සම්බන්ධ කර ගැනීමට සේවාදායකයාට ක්‍රමයක් ලබා දිය හැකිය.

ඔබේ යන්ත්‍රයේ:

ssh -R 11111:localhost:22 REMOTE_USERNAME@SERVERNAME

ඔබ සේවාදායකයට ලොග් වීමට අමතරව, මෙය සේවාදායකයේ වරාය 11111 හි ඇති සෑම සම්බන්ධතාවයක්ම ඔබේ යන්ත්‍රයේ වරාය 22 වෙත යවනු ඇත: ඔබ sshdසවන් දෙන වරාය .

සේවාදායකයේ, ගොනු හුවමාරුව මේ ආකාරයෙන් ආරම්භ කරන්න:

cd /var/www/
sudo scp -P 11111 -r LOCAL_USERNAME@localhost:FOLDERNAME .

1

මෙම මාතෘකාවෙන් දේවානුභාවයෙන් මා ලියා ඇති ස්ක්‍රිප්ට් ඔබට භාවිතා කළ හැකිය:

touch /tmp/justtest && scpassudo /tmp/justtest remoteuser@ssh.superserver.com:/tmp/

නමුත් මේ සඳහා පිස්සු දේවල් අවශ්‍ය වේ (එය btw. ස්වයංක්‍රීයව ස්ක්‍රිප්ට් මඟින් සිදු කරයි)

  1. මූලාශ්‍ර පරිගණකයට ssh සම්බන්ධතාවය ස්ථාපනය කරන අතරතුර සේවාදායකය තවදුරටත් මුරපදය ඉල්ලන්නේ නැත
  2. සේවාදායකයේ sudo විමසුමේ lack නතාවයේ අවශ්‍යතාවය නිසා, sudo තවදුරටත් දුරස්ථ යන්ත්‍රයේ මුරපදය ඉල්ලන්නේ නැත, පරිශීලකයා සඳහා

පිටපත මෙන්න:

interface=wlan0
if [[ $# -ge 3 ]]; then interface=$3; fi
thisIP=$(ifconfig | grep $interface -b1 | tail -n1 | egrep -o '[0-9.]{4,}' -m1 | head -n 1)
thisUser=$(whoami)
localFilePath=/tmp/justfortest
destIP=192.168.0.2
destUser=silesia
#dest 
#destFolderOnRemoteMachine=/opt/glassfish/glassfish/
#destFolderOnRemoteMachine=/tmp/

if [[ $# -eq 0 ]]; then 
echo -e "Send file to remote server to locatoin where root permision is needed.\n\tusage: $0 local_filename [username@](ip|host):(remote_folder/|remote_filename) [optionalInterface=wlan0]"
echo -e "Example: \n\ttouch /tmp/justtest &&\n\t $0 /tmp/justtest remoteuser@ssh.superserver.com:/tmp/ "
exit 1
fi

localFilePath=$1

test -e $localFilePath 

destString=$2
usernameAndHost=$(echo $destString | cut -f1 -d':')

if [[ "$usernameAndHost" == *"@"* ]]; then
destUser=$(echo $usernameAndHost | cut -f1 -d'@')
destIP=$(echo $usernameAndHost | cut -f2 -d'@')
else
destIP=$usernameAndHost
destUser=$thisUser
fi

destFolderOnRemoteMachine=$(echo $destString | cut -f2 -d':')

set -e #stop script if there is even single error

echo 'First step: we need to be able to execute scp without any user interaction'
echo 'generating public key on machine, which will receive file'
ssh $destUser@$destIP 'test -e ~/.ssh/id_rsa.pub -a -e ~/.ssh/id_rsa || ssh-keygen -t rsa'
echo 'Done'

echo 'Second step: download public key from remote machine to this machine so this machine allows remote machine (this one receiveing file) to login without asking for password'

key=$(ssh $destUser@$destIP 'cat ~/.ssh/id_rsa.pub')
if ! grep "$key" ~/.ssh/authorized_keys; then
echo $key >> ~/.ssh/authorized_keys
echo 'Added key to authorized hosts'
else
echo "Key already exists in authorized keys"
fi

echo "We will want to execute sudo command remotely, which means turning off asking for password"
echo 'This can be done by this tutorial http://stackoverflow.com/a/10310407/781312'
echo 'This you have to do manually: '
echo -e "execute in new terminal: \n\tssh $destUser:$destIP\nPress enter when ready"
read 
echo 'run there sudo visudo'
read
echo 'change '
echo '    %sudo   ALL=(ALL:ALL) ALL'
echo 'to'
echo '    %sudo   ALL=(ALL:ALL) NOPASSWD: ALL'
echo "After this step you will be done."
read

listOfFiles=$(ssh $destUser@$destIP "sudo ls -a")

if [[ "$listOfFiles" != "" ]]; then 
echo "Sending by executing command, in fact, receiving, file on remote machine"
echo 'Note that this command (due to " instead of '', see man bash | less -p''quotes'') is filled with values from local machine'
echo -e "Executing \n\t""identy=~/.ssh/id_rsa; sudo scp -i \$identy $(whoami)@$thisIP:$(readlink -f $localFilePath) $destFolderOnRemoteMachine"" \non remote machine"
ssh $destUser@$destIP "identy=~/.ssh/id_rsa; sudo scp -i \$identy $(whoami)@$thisIP:$(readlink -f $localFilePath) $destFolderOnRemoteMachine"
ssh $destUser@$destIP "ls ${destFolderOnRemoteMachine%\\\\n}/$(basename $localFilePath)"
if [[ ! "$?" -eq 0 ]]; then echo "errror in validating"; else echo -e "SUCCESS! Successfully sent\n\t$localFilePath \nto \n\t$destString\nFind more at http://arzoxadi.tk"; fi
else
echo "something went wrong with executing sudo on remote host, failure"

fi
ENDOFSCRIPT
) | sudo tee /usr/bin/scpassudo && chmod +x /usr/bin/scpassudo

Ra බ්‍රේම් ඔව්, විශ්වාසයි, සබැඳිය ගැන කණගාටුයි, පිටපත සෑහෙන්න දිගු වන අතර එය හේතුව එයයි :)
test30

1

Root ලෙස ලොග් වීමට සහ ඔබේ පරිශීලකයා සමඟ ලිපිගොනු වෙත පිවිසීමට අවසරයක් නොමැතිව සේවාදායකයන් අතර ලිපිගොනු මාරු කිරීමට ඔබට ssh, sudo සහ උදා තාර ඒකාබද්ධ කළ හැකිය. මෙය තරමක් විකාර සහගත ය, එබැවින් මම මේ සඳහා පිටපතක් ලියා ඇත. ඔබට මෙහි පිටපත සොයාගත හැකිය: https://github.com/sigmunau/sudoscp

හෝ මෙහි:

#! / බින් / බාෂ්
res = 0
සිට = $ 1
to = $ 2
මාරුව
මාරුව
files = "$ @"
-z "test" -o -z "$ සිට" -o -z "$ ගොනු" ටෙස්ට් නම්
එවිට
    echo "භාවිතය: $ 0 (ගොනුව) *"
    echo "උදාහරණය: server 0 server1 server2 / usr / bin / myapp"
    පිටවීම 1
fi

read -s -p "මුරපදය ඇතුළත් කරන්න:" sudopassword
echo ""
temp1 = $ (mktemp)
temp2 = $ (mktemp)
. > $ temp2
sourceres = {{PIPESTATUS [0]}
[$? -ne 0 -o $ sourceres -ne 0]
එවිට
    echo "අසමත්!" > & 2
    echo "output ප්‍රතිදානයෙන්:"> & 2
    cat $ temp1> & 2
    echo ""> & 2
    echo "output ප්‍රතිදානයට:"> & 2
    cat $ temp2> & 2
    res = 1
fi

rm $ temp1 $ temp2
පිටවීම $ res

Ask උබුන්ටු වෙත සාදරයෙන් පිළිගනිමු. කරුණාකර ඔබේ පිළිතුරෙහි පිටපත ඇතුළත් කළ හැකිද? මම දන්නවා එය කළ නොහැක්කක් නමුත් ගිතුබ් රෙපෝ කවදා හෝ ඉවත් කර හෝ යූආර්එල් වෙනස් කර ඇත්නම් පිළිතුර අවලංගු වනු ඇත. ස්ක්‍රිප්ට් කෙලින්ම ඇතුළත් කර ගිතුබ් රෙපෝ ප්‍රභවයක් ලෙස තැබීම වඩා හොඳය.
මයිකල් ලින්ඩ්මන්

1

විලී වීලර්ගේ පිළිතුරෙහි නවීකරණය කරන ලද අනුවාදයක් වන අතර එය ගොනුව (ය) තාර හරහා මාරු කරන අතර දුරස්ථ ධාරකයේ සුඩෝ වෙත මුරපදයක් යැවීමටද සහාය වේ.

(stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) \
  | ssh remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""

මෙහි ඇති අමතර මැජික් ටිකක් සුඩෝ සඳහා -S විකල්පයයි. සුඩෝ මෑන් පිටුවෙන්:

-S, --stdin ටර්මිනල් උපාංගය භාවිතා කිරීම වෙනුවට සම්මත දෝෂයට විමසුම ලියා සම්මත ආදානයෙන් මුරපදය කියවන්න. මුරපදය නව රේඛා අක්ෂරයකින් අනුගමනය කළ යුතුය.

දැන් අපට ඇත්ත වශයෙන්ම අවශ්‍ය වන්නේ තාරයේ ප්‍රතිදානය ssh තුළට නල මාර්ගයට ගෙන ඒමයි. එමඟින් ssh හි stdin තාරයේ stdout වෙත හරවා යවන අතර අන්තර්ක්‍රියාකාරී පර්යන්තයෙන් sudo වෙත මුරපදය යැවීමට ඇති ඕනෑම ක්‍රමයක් ඉවත් කරයි. . උප කුලකය ssh බවට. අපගේ මුරපදය අඩංගු පරිසර විචල්‍යයක් අපගේ අන්තර්ක්‍රියාකාරී කවචයේ නොතැබීමේ අමතර වාසියක් ද මෙයට ඇත.

විමසුමක් මුද්‍රණය කිරීම සඳහා -p විකල්පය සමඟ මම 'කියවීම' ක්‍රියාත්මක නොකළ බව ඔබට පෙනෙනු ඇත. මෙයට හේතුව සුඩෝ වෙතින් මුරපද විමසුම ssh හරහා අපගේ අන්තර්ක්‍රියාකාරී කවචයේ stderr වෙත පහසුවෙන් ලබා දීමයි. "අපගේ පයිප්පයේ දකුණට ssh ඇතුලත ක්‍රියාත්මක වන විට සුඩෝ ක්‍රියාත්මක වන්නේ කෙසේද?" අපි බහුවිධ විධානයන් ක්‍රියාත්මක කර එකිනෙකට ප්‍රතිදානය පයිප්ප කරන විට, මව් කවචය (මෙම නඩුවේ අන්තර්ක්‍රියාකාරී කවචය) එක් එක් විධානය කලින් ක්‍රියාත්මක කළ විගසම අනුක්‍රමයෙහි ක්‍රියාත්මක කරයි. පයිප්පයක් පිටුපස ඇති සෑම විධානයක්ම ක්‍රියාත්මක වන විට, මව් කවචය වම් පස පැත්තෙහි දකුණු පස ඇති ස්ටැඩින් එකට සම්බන්ධ කරයි (හරවා යවයි). ක්‍රියාවලිය හරහා ගමන් කරන විට ප්‍රතිදානය ආදානය බවට පත්වේ.

$ (stty -echo; read passwd; stty echo; echo $passwd; tar -cz foo.*) | ssh 
remote_host "sudo -S bash -c \"tar -C /var/www/ -xz; echo\""
[sudo] password for bruce: 
[1]+  Stopped                 ( stty -echo; read passwd; stty echo; echo 
$passwd; tar -cz foo.* ) | ssh remote_host "sudo -S bash -c \"tar -C 
/var/www/ -xz; echo\""

$ pstree -lap $$
bash,7168
  ├─bash,7969
  ├─pstree,7972 -lap 7168
  └─ssh,7970 remote_host sudo -S bash -c "tar -C /var/www/ -xz; echo"`

අපගේ අන්තර්ක්‍රියාකාරී කවචය PID 7168 වේ, අපගේ උප කුලකය PID 7969 වන අතර අපගේ ssh ක්‍රියාවලිය PID 7970 වේ.

එකම අඩුපාඩුව නම්, සූඩෝගේ විමසුම ආපසු යැවීමට කාලය ලැබීමට පෙර කියවීම ආදානය භාර ගැනීමයි. වේගවත් සම්බන්ධතාවයකින් සහ වේගවත් දුරස්ථ ධාරකයකදී ඔබ මෙය නොදකින නමුත් මන්දගාමී නම් ඔබට එය කළ හැකිය. ඕනෑම ප්‍රමාදයක් විමසුමට ඇතුළු වීමේ හැකියාව කෙරෙහි බලපාන්නේ නැත; ඔබ ටයිප් කිරීමට පටන් ගත් පසු එය දිස්වනු ඇත.

සටහන මම නිරූපණය සඳහා මගේ දේශීය යන්ත්‍රයට "remote_Host" සඳහා ධාරක ගොනු ඇතුළත් කිරීමක් එක් කළෙමි.


Bash භාවිතා කරන්නේ නම්, සහ භාවිතා කිරීම read -s passwdවෙනුවට භාවිතා කළ හැකිය . stty -echostty echo
ඩැනියෙල් හාඩිං
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.