Scp দিয়ে রুট অ্যাক্সেসের প্রয়োজন असलेल्या ফাইলগুলি আমি কীভাবে অনুলিপি করব?


167

আমার একটি উবুন্টু সার্ভার রয়েছে যার সাথে আমি এসএসএইচ ব্যবহার করে সংযোগ করছি।

আমার /var/www/সার্ভারে আমার মেশিন থেকে ফাইলগুলি আপলোড করা দরকার , ফাইলগুলি /var/www/মালিকানাধীন root

পিটিটিওয়াই ব্যবহার করে, আমি লগ ইন করার পরে, sudo suফাইলগুলিতে সংশোধন করতে সক্ষম হতে প্রথমে আমাকে আমার পাসওয়ার্ডটি টাইপ করতে হবে /var/www/

তবে আমি যখন উইনসিসিপি ব্যবহার করে ফাইলগুলি অনুলিপি করছি তখন আমি ফাইলগুলি তৈরি / পরিবর্তন করতে পারি না /var/www/, কারণ আমি যে ব্যবহারকারীটির সাথে সংযোগ করছি তার ফাইলে ফাইলগুলির অনুমতি নেই /var/www/এবং sudo suএসএসএস সেশনের ক্ষেত্রে আমি যেমন করতে পারি তেমন বলতে পারি না s ।

আপনি কি জানেন যে আমি কীভাবে এটি মোকাবেলা করতে পারি?

আমি যদি আমার লোকাল মেশিনে কাজ করতাম তবে আমি কল করতাম gksudo nautilusতবে এই ক্ষেত্রে আমার কাছে কেবল মেশিনে টার্মিনাল অ্যাক্সেস রয়েছে।


এটি আপনার ভার্চুয়াল সার্ভার সরবরাহকারীর জন্য বা পুট্টি বা উইন্সসিপি বিকাশকারীদের কাছে আরও প্রশ্নের মতো মনে হচ্ছে।
dobey

7
@ ডাবী আপনি অবিস্মরণীয়ভাবে ভুল, এটি উবুন্টু সুবিধাগুলি সম্পর্কে!
দিমিত্রিস সাপিকাস

7
কেন এটি বন্ধ? এটি স্কিপি দিয়ে ফাইলগুলি অনুলিপি করার বিষয়ে একটি সম্পূর্ণ বৈধ প্রশ্ন - প্রতিটি ওয়েব বিকাশকারী এই পরিস্থিতির সাথে পরিচিত
সের্গেই


আমি একই সমস্যা আছে। আমি উইন্ডোজ কম্পিউটারে একটি ফাইল (এই ক্ষেত্রে এইচটিএমএল) তৈরি করি এবং এটি WinSCP দিয়ে / var / www / html / ওয়েবসাইট ফোল্ডারে অনুলিপি করার চেষ্টা করি। এবং এটি বলে যে এখানে কোনও অনুমতি সমস্যা রয়েছে। যেহেতু আমি আমার / হোম ফোল্ডারে অনুলিপি করতে পেরেছি ফাইলটি দুটি ধাপে অনুলিপি করেছি, তবে এটি খুব সুবিধাজনক নয় :-) আমি আমার ব্যবহারকারীকে www-ডেটা গ্রুপে যুক্ত করার চেষ্টা করেছি, তবে তাতে কোনও লাভ হয়নি। ব্যবহারকারীরা www-ডেটাতে যুক্ত করে এমন কোনও ধারণা কেন এখনও ব্যবহারকারীরা www-ডেটা গ্রুপের মালিকানাধীন ফোল্ডারে কোনও ফাইল অনুলিপি করার অনুমতি দেয় না?
জেনেজক্রঞ্জস্কি

উত্তর:


125

আপনি ঠিক বলেছেন, sudoকাজ করার সময় কিছুই নেই scpscpআপনার ব্যবহারকারীর এমন কোনও ডিরেক্টরিতে ফাইলগুলি আপলোড করার জন্য একটি কার্যপ্রণালী হ'ল ব্যবহার করা, যেখানে এসএসএসের মাধ্যমে লগ ইন করুন এবং 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, তবে এই বৈশিষ্ট্যটি কোনও কারণে অক্ষম করা হয়েছে, তাই আমি আপনাকে তা করার বিরুদ্ধে দৃ strongly়ভাবে পরামর্শ দেব।


আমি প্রথম সমাধানটি পেলাম না, আপনি দয়া করে একটি লিটল আরও মাতাল হতে পারেন?
দিমিত্রিস সাপিকাস

আমি আমার নিজের ফাইলগুলি বলতে / var / www বলতে চাই, আমি আমার ভিপিএসকে ওয়েব সার্ভার হিসাবে ব্যবহার করছি .... আমার নিজের ফোল্ডারে আমার সম্পূর্ণ অ্যাক্সেস রয়েছে
দিমিত্রিস সাপিকাস

7
করছেন। প্রথম সমাধান। 1. scp -R mysite dimitris@myserver.com:/home/dimitris/2. ssh dimitris@myserver.com3. sudo mv ~/mysite /var/www- এটি একটি 2-পদক্ষেপ প্রক্রিয়া, প্রথমে scpফাইলগুলি আপনার বাড়ির ডায়ারে নিয়ে যান, তারপরে আপনি এসএসএসের মাধ্যমে লগ ইন করেন এবং ফাইলগুলি যেখানে হওয়া উচিত সেখানে অনুলিপি / সরিয়ে নিয়ে যান
সের্গেই

36

আরেকটি পদ্ধতি হ'ল scp এর পরিবর্তে tar + ssh ব্যবহার করে অনুলিপি করা:

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

2
এটি করার সেরা উপায় এটি।
এমটিডিডিবিআরড

2
আমি এই পদ্ধতিটি সফলভাবে কাজ করতে পারি না। লিখিত হিসাবে আমি পেতে sudo: sorry, you must have a tty to run sudo। আমি যদি কোনও টিটিওয়াই বরাদ্দ করতে "-t" যোগ করি তবে আমি পাই Pseudo-terminal will not be allocated because stdin is not a terminal.। আমি পাসওয়ার্ডহীন sudo ছাড়া এটি কাজ দেখতে পাচ্ছি না।
আইবিবোর্ড

1
@ আইবিবোর্ড: ssh -t ব্যবহার করে এখানে সমাধানটি চেষ্টা করুন :ssh -t dimitris@myserver.com "sudo tar -x --no-same-owner -C /var/www"
আলেকজান্ডার বার্ড

2
@ আলেকজান্ডারবার্ড যদিও এটি অনেক ক্ষেত্রে কাজ করে তবে আমি নিশ্চিত নই যে এটি এখানে কাজ করে কারণ আমরা এসএসএইচ সংযোগের উপর একটি টারবাল পাইপ করার চেষ্টা করছি। সার্ভারফল্ট
প্রশ্ন /

অবশেষে আমার জন্য এটি কাজ করেছিল। আপনার কাছে এমন কোনও রিমোট ফাইলের অনুমতি নেই যা আপনি স্থানীয় অনুলিপি করতে চান, এটি করতে sudo tar, সংরক্ষণাগারভুক্ত করতে, chmodএবং ব্যবহারের অনুমতিগুলি পরিবর্তন করতে chownএবং তারপরে লোকালটিতে অনুলিপি করতে চান। বিশেষত এটি যদি একটি ডিরেক্টরি।
ফোরামুলেটর

27

দ্রুত উপায়

সার্ভার থেকে স্থানীয় মেশিনে:

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

স্থানীয় মেশিন থেকে সার্ভারে:

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

5
এই উত্তর আন্ডাররেটেড হয়। এটি সাধারণ, পরিষ্কার, একক পারমাণবিক ক্রিয়াকলাপ সহ একটি রুট ফাইলটি পড়তে বা লিখতে পারে এবং যদি আপনি স্কেপ্প ব্যবহার করে থাকেন তবে এমন কোনও কিছুর আগেই গ্যারান্টিযুক্ত নেই requires প্রধান অসুবিধাটি হ'ল এটি অনুমতিগুলি অনুলিপি করে না। আপনি যদি এটি চান তবে তারের সমাধান আরও ভাল। এটি একটি শক্তিশালী কৌশল, বিশেষত যদি এক্সার্গস / বাশ
যাদুটির

আমি মনে করি প্রশ্নটি স্থানীয় থেকে প্রত্যন্তে ফাইল আপলোড করার বিষয়ে ছিল এবং বিপরীতে নয়
Korayem

1
সুন্দরভাবে সম্পন্ন হয়েছে। আমি ওপরে ও নিচে উভয়ের জন্য ঠিক এটিই খুঁজছিলাম। আপনাকে ধন্যবাদ
জেরেমি

নিশ্চিতভাবে শীর্ষস্থানীয় উত্তর হতে হবে।
অ্যান্ড্রু ওয়াটসন

এটি কি কোনও ফাইলের পরিবর্তে ডিরেক্টরিতে করা যেতে পারে?
lucidbrot

26

ansibleএটি সম্পাদন করতে আপনিও ব্যবহার করতে পারেন।

জবাবদিহি copyমডিউলটি ব্যবহার করে দূরবর্তী হোস্টে অনুলিপি করুন :

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

জবাবদিহির fetchমডিউলটি ব্যবহার করে দূরবর্তী হোস্ট থেকে আনুন :

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

বিঃদ্রঃ:

  • -i HOST,সিনট্যাক্সে কমাটি টাইপো নয়। কোনও ইনভেন্টরি ফাইলের প্রয়োজন ছাড়াই জবাবদিহি করার উপায়।
  • -bসার্ভারে ক্রিয়াগুলি রুট হিসাবে সম্পন্ন করে। -bপ্রসারিত হয় --becomeএবং ডিফল্টটি --become-userমূল হয় মূলত ডিফল্ট --become-methodসুডো হয়।
  • 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

পিএস, আমি বুঝতে পেরেছি যে "কেবল এই কল্পিত সরঞ্জামটি ইনস্টল করুন" বলাটি একটি স্বর-বধির উত্তর। তবে আমি রিমোট সার্ভারগুলি পরিচালনার জন্য অত্যন্ত দরকারী হিসাবে জবাবদিহি পেয়েছি , সুতরাং এটি ইনস্টল করা অবশ্যই অবশ্যই ফাইল মোতায়েনের বাইরে অন্যান্য সুবিধা নিয়ে আসবে।


আমি এই উত্তরটি পছন্দ করি তবে আমি আপনাকে প্রস্তাবটি উত্সাহ দেওয়ার আগে আরও সাধারণীকৃত ভাষ্য বনাম জিজ্ঞাসিত প্রশ্নে এটি নির্দেশ করার পরামর্শ দিচ্ছি। এরকম কিছুansible -i "hostname," all -u user --become -m copy -a ...
মাইক ডি

@ মাইকডি: উপরের পরিবর্তনগুলি কীভাবে দেখায়?
এরিক.ওয়েথার্স

1
-i 'host,'বৈধ বাক্য গঠন কি এমন কিছু হবে? আমি মনে করি কোনও কমান্ড পড়ার সময় এর মতো বিরামচিহ্নগুলি হারাতে সহজ। (পাঠকের জন্য আমি বলতে চাইছি, শেল না হলে)
mwfearnley

1
@mwfearnley: নিশ্চিত, শেল বিবেচনা করবে -i 'host,'এবং একই -i host,বা -i "host,"। সাধারণভাবে আমি এই আহ্বানগুলি যতটা সম্ভব কমিয়ে আনা পছন্দ করি যাতে এগুলি দু: খিত হওয়া থেকে দূরে থাকে তবে আপনি স্পষ্টতই স্পষ্ট করে তুলতে দ্বিধা বোধ করা উচিত কারণ আপনারা মনে করেন যে স্পষ্টতার প্রয়োজন is
এরিক.ওয়েথার্স

2
বক্সের বাইরে ভাবতে যাওয়ার উপায়!
জবাবের

12

আপনি যখন চালনা করবেন sudo su, আপনার তৈরি করা কোনও ফাইল রুটের মালিকানাধীন হবে, তবে ডিফল্টরূপে ssh বা scp এর সাহায্যে রুট হিসাবে সরাসরি লগ ইন করা সম্ভব নয়। স্কোপ সহ সুডো ব্যবহার করাও সম্ভব নয়, সুতরাং ফাইলগুলি ব্যবহারযোগ্য নয়। আপনার ফাইলগুলির মালিকানা দাবি করে এটি ঠিক করুন:

আপনার ব্যবহারকারীর নাম দিমিত্রি অনুমান করে আপনি এই আদেশটি ব্যবহার করতে পারেন।

sudo chown -R dimitri:dimitri /home/dimitri

তারপরে, অন্য উত্তরে যেমন উল্লেখ করা হয়েছে, "উবুন্টু" উপায়টি হল সুডো ব্যবহার করা, এবং মূল লগইন নয়। এটি দুর্দান্ত সুরক্ষার সুবিধার সাথে একটি কার্যকর দৃষ্টান্ত।


আমি এই সমাধানটি যে কোনও sudo chow ...
উপায়েই

2
সুবিধার্থে পাস করার জন্য ব্যবহারকারীকে সমস্ত সিস্টেম ফাইলের মালিকানা পরিবর্তন করা অত্যন্ত নিরুৎসাহিত। এটি আপনার সিস্টেমে সুরক্ষার সাথে মারাত্মকভাবে আপস করার জন্য যে কোনও ইউজারস্পেস বাগটি সম্মুখীন হতে পারে allows এসসিপি দ্বারা আপনার যে ফাইলগুলি পরিবর্তন করতে বা আপডেট করতে হবে তার মালিকানা পরিবর্তন করা আরও ভাল, তবে রুটের মালিকানাধীন সমস্ত কিছু ছেড়ে দেওয়ার জন্য (যেমন এটি বলে মনে করা হয়)। এটি বলেছিল, -Rইন- chownএটিকে সেই ডিরেক্টরিটির মালিকানা এবং সমস্ত শিশুদের ফাইল এবং ডিরেক্টরিগুলি পুনরাবৃত্তভাবে পরিবর্তন করতে বলে ... যাতে আপনি নিজের পছন্দমতো কিছু করতে পারেন।
30:48

হুম .... মনে হচ্ছে ঠিক আছে, ধন্যবাদ! দুঃখিত আমি
upvote

11

হতে সবচেয়ে ভালো উপায় ব্যবহার করা rsync( Cygwin / cwRsync SSH- র মাধ্যমে উইন্ডোজে)?

উদাহরণস্বরূপ, মালিকের সাথে ফাইলগুলি আপলোড করতে 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

দেখুন: সুডো সহ রিমোট সার্ভারে স্কিপ করুন


5

আপনি যদি পুটিটির পরিবর্তে ওপেনএসএইচ সরঞ্জামগুলি ব্যবহার করেন তবে আপনি scpসার্ভারে ফাইল ট্রান্সফার শুরু করে এটি সম্পাদন করতে পারেন sudosshdআপনার স্থানীয় মেশিনে কোনও ডেমন চলছে তা নিশ্চিত করুন । সঙ্গে 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/

তবে এর জন্য কিছু ক্রেজি স্টাফ প্রয়োজন (যা বিটিডব্লিউ automatically

  1. উত্স কম্পিউটারে এসএসএস সংযোগ স্থাপনের সময় কোন ফাইলটিতে সার্ভার প্রেরণ করা হচ্ছে তা আর পাসওয়ার্ডের জন্য জিজ্ঞাসা করবে না
  2. সার্ভারে সুডো প্রম্পটের অভাবের প্রয়োজনীয়তার কারণে, সুডো আর রিমোট মেশিনে ব্যবহারকারীর জন্য পাসওয়ার্ড চাইবে না

এখানে স্ক্রিপ্ট চলে:

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

@ ব্রায়াম হ্যাঁ, অবশ্যই, লিঙ্কটির জন্য দুঃখিত, স্ক্রিপ্টটি বেশ দীর্ঘ এবং এর কারণ ছিল :)
টেস্ট ৩০

1

রুট হিসাবে লগ ইন না করে এবং আপনার ব্যবহারকারীর সাথে ফাইল অ্যাক্সেসের অনুমতি না পেয়ে সার্ভারের মধ্যে ফাইল স্থানান্তর করতে আপনি ssh, sudo এবং উদাহরণস্বরূপ টারকে একত্রিত করতে পারেন। এটি কিছুটা স্পষ্টভাবে, সুতরাং এটির জন্য আমি একটি স্ক্রিপ্ট লিখেছি। আপনি এখানে স্ক্রিপ্টটি খুঁজে পেতে পারেন: https://github.com/sigmunau/sudoscp

বা এখানে:

#! / বিন / ব্যাশ
মাঝামাঝি = 0
= $ 1 থেকে
= $ 2
পরিবর্তন
পরিবর্তন
ফাইল = "$ @"
যদি -z "$" -o -z "$ থেকে" -o -z "$ ফাইলগুলিতে" পরীক্ষা করা হয় "
তারপর
    প্রতিধ্বনি "ব্যবহার: $ 0 (ফাইল) *"
    প্রতিধ্বনি "উদাহরণ: server 0 সার্ভার 1 সার্ভার 2 / ইউএসআর / বিন / মায়াপ"
    প্রস্থান 1
ফাই

পড়ুন -s -p "পাসওয়ার্ড প্রবেশ করুন:" সুডোপ্যাসওয়ার্ড
প্রতিধ্বনি ""
temp1 = $ (mktemp)
temp2 = $ (mktemp)
(প্রতিধ্বনি "$ সুডোপ্যাসওয়ার্ড"; প্রতিধ্বনি "$ সুডোপ্যাসওয়ার্ড" | ssh su সুডো-এস টার সি-পি-সি / $ ফাইলগুলি 2> $ টেম্প 1) | এসএসএস $ থেকে সুডো-এস টার এক্স-ভি -পি -সি / 2 > $ temp2
sourceres = $ {PIPESTATUS [0]}
যদি [$? -ne 0 -o $ উত্স -ne 0]
তারপর
    প্রতিধ্বনি "ব্যর্থতা!" > & 2
    প্রতিস্থাপন থেকে "cho প্রতিধ্বনি:"> & 2
    বিড়াল << temp1> & 2
    প্রতিধ্বনি ""> & 2
    প্রতিস্থাপনে "$" প্রতিধ্বনি: "> & 2
    বিড়াল << temp2> & 2
    মাঝামাঝি = 1
ফাই

rm $ temp1 $ temp2
প্রস্থান $ রেজ

উবুন্টুকে জিজ্ঞাসা করুন স্বাগতম আপনি দয়া করে আপনার উত্তরে স্ক্রিপ্টটি অন্তর্ভুক্ত করতে পারেন? আমি জানি এটি অসম্ভাব্য, তবে যদি গিথুব রেপোটি কখনও সরানো হয় বা ইউআরএল পরিবর্তিত হয় তবে উত্তরটি বাতিল হবে oid সরাসরি স্ক্রিপ্টটি অন্তর্ভুক্ত করা এবং গিথুব রেপো উত্স হিসাবে ছেড়ে দেওয়া ভাল।
মাইকেল লিন্ডম্যান

0

এখানে উইলি হুইলারের উত্তরের একটি পরিবর্তিত সংস্করণ যা ফাইলের মাধ্যমে টর মাধ্যমে স্থানান্তরিত করে কিন্তু দূরবর্তী হোস্টে sudo পাসওয়ার্ডটি সমর্থন করে।

(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- এ পাইপ করতে চাইছি এবং এটি ইন্টারেক্টিভ টার্মিনাল থেকে পাসওয়ার্ডকে sudo-তে পাস করার যে কোনও উপায় সরিয়ে, ssh এর স্টিডিনকে টার স্টাডআউটে পুনর্নির্দেশ করে। (আমরা রিমোট প্রান্তে সুডোর এএসপিএএসএস বৈশিষ্ট্যটি ব্যবহার করতে পারি তবে এটি অন্য গল্প)) পাসওয়ার্ডটি আগে থেকে ক্যাপচার করে এবং ট্যারে আউটপুটে এটি প্রেরণ করে সাবস্কেলের মাধ্যমে এবং আউটপুটটি পাইপ করে আমরা sudo তে পেতে পারি We এসএসএসে সাবশেল। আমাদের ইন্টারেক্টিভ শেলটিতে আমাদের পাসওয়ার্ড ঝুঁকিতে থাকা পরিবেশের ভেরিয়েবলটি না রাখারও এর অতিরিক্ত সুবিধা রয়েছে।

আপনি লক্ষ্য করবেন আমি প্রম্পট মুদ্রণের জন্য -p বিকল্পটি দিয়ে 'পঠন' সম্পাদন করিনি। এটি কারণ sudo থেকে পাসওয়ার্ড প্রম্পটটি সহজেই আমাদের ইন্টারেক্টিভ শেলের স্ট্যাডারে 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"`

আমাদের ইন্টারেক্টিভ শেলটি পিআইডি 68১6868, আমাদের সাবশেল পিআইডি 69৯69৯ এবং আমাদের এসএসএস প্রক্রিয়াটি পিআইডি 70৯70০।

একমাত্র ত্রুটিটি হ'ল সুডোর প্রম্পটটি ফেরত দেওয়ার সময় দেওয়ার আগে পঠন ইনপুট গ্রহণ করবে। একটি দ্রুত সংযোগ এবং দ্রুত দূরবর্তী হোস্টে আপনি এটি লক্ষ্য করবেন না তবে আপনি যদি হয় ধীর হয় তবে। কোনও বিলম্ব প্রম্পটে প্রবেশের ক্ষমতাকে প্রভাবিত করবে না; আপনি টাইপ করা শুরু করার পরে এটি প্রদর্শিত হতে পারে।

দ্রষ্টব্য আমি ডেমোর জন্য আমার লোকাল মেশিনে কেবল "রিমোট_হস্ট" এর জন্য একটি হোস্ট ফাইল এন্ট্রি যুক্ত করেছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.