স্ক্রিপ্ট ব্যবহার করা সহজ
কয়েক বছর ধরে আমি এখানে প্রতিটি অন্যান্য উত্তরের মতো কম-বেশি একই কৌশল দ্বারা বহুবার এটি করেছি। তবে কিছু বিশদ ভুল পাওয়া খুব সহজ এবং বিষয়টি নীচে স্ক্রিপ্ট নিয়ে এসেছি তা বের করতে অনেক সময় ব্যয় করা:
- সমস্ত বিবরণ নির্দিষ্ট করার জন্য এটি সহজ করে তোলে (উত্স, গন্তব্য, বিকল্পগুলি)
- প্রতিটি একক ধাপে ক্রমবর্ধমান পরীক্ষা করে এবং কিছু ভুল হলে প্রতিক্রিয়া দেয়, যাতে আপনি কী ঠিক করবেন তা জানেন।
ssh -A
প্রমাণীকরণের ডেটা প্রচারে ব্যর্থ হয় এমন কেসগুলির চারপাশে কাজ করে (কখনও কখনও কেন এটি ঘটে তা জানেন না যেহেতু মূল কারণ অনুসন্ধান করার চেয়ে কাজের সমাধানটি সহজ ছিল)
- অবশেষে কাজ করে।
স্ক্রিপ্টটি কীভাবে ব্যবহার করবেন
- আপনি কোনও পাসওয়ার্ড টাইপ না করে লোকালহোস্ট থেকে উভয় হোস্টকে ছুঁড়ে ফেলতে পারেন তা নিশ্চিত করুন ।
- স্ক্রিপ্টের প্রথম কয়েকটি লাইনে ভেরিয়েবল সেট করুন
- এটি কার্যকর করুন।
কিভাবে এটা কাজ করে
আমি যেমন বলেছি যে এটি এখানে অন্য প্রতিটি উত্তরের মতো একই কৌশল ব্যবহার করে:
-R
লোকালহোস্ট থেকে হোস্ট 1 এ এসএসএস- এর বিকল্প একই সময়ে পোর্ট ফরোয়ার্ডিং সেটআপ করার পরে হোস্ট 1 কে লোকালহোস্টের মাধ্যমে হোস্ট 2 ( -R localhost:$FREE_PORT:$TARGET_ADDR_PORT
) এর সাথে সংযোগ করার অনুমতি দেয়
-A
দ্বিতীয় এসএস চ্যানেলের সহজ প্রমাণীকরণের অনুমতি দেওয়ার জন্য এসএসএসের বিকল্প
আমার এই জটিল! কোন সহজ উপায় আছে?
যখন উৎস থেকে গন্তব্যে সকল বা অধিকাংশ বাইট কপি এটা দূরে সহজে ব্যবহারযোগ্য করতে tar
:
ssh $SOURCE_HOST "tar czf - $SOURCE_PATH" \
| ssh $TARGET_HOST "tar xzf - -C $TARGET_PATH/"
এই পান্ডুলিপি
#!/bin/bash
#-------------------SET EVERYTHING BELOW-------------------
# whatever you type after ssh to connect to SOURCE/TARGE host
# (e.g. 1.2.3.4:22, user@host:22000, ssh_config_alias, etc)
# So if you use "ssh foo" to connect to SOURCE then
# you must set SOURCE_HOST=foo
SOURCE_HOST=host1
TARGET_HOST=host2
# The IP address or hostname and ssh port of TARGET AS SEEN FROM LOCALHOST
# So if ssh -p 5678 someuser@1.2.3.4 will connect you to TARGET then
# you must set TARGET_ADDR_PORT=1.2.3.4:5678 and
# you must set TARGET_USER=someuser
TARGET_ADDR_PORT=1.2.3.4:5678
TARGET_USER=someuser
SOURCE_PATH=/mnt/foo # Path to rsync FROM
TARGET_PATH=/mnt/bar # Path to rsync TO
RSYNC_OPTS="-av --bwlimit=14M --progress" # rsync options
FREE_PORT=54321 # just a free TCP port on localhost
#---------------------------------------------------------
echo -n "Test: ssh to $TARGET_HOST: "
ssh $TARGET_HOST echo PASSED| grep PASSED || exit 2
echo -n "Test: ssh to $SOURCE_HOST: "
ssh $SOURCE_HOST echo PASSED| grep PASSED || exit 3
echo -n "Verifying path in $SOURCE_HOST "
ssh $SOURCE_HOST stat $SOURCE_PATH | grep "File:" || exit 5
echo -n "Verifying path in $TARGET_HOST "
ssh $TARGET_HOST stat $TARGET_PATH | grep "File:" || exit 5
echo "configuring ssh from $SOURCE_HOST to $TARGET_HOST via locahost"
ssh $SOURCE_HOST "echo \"Host tmpsshrs; ControlMaster auto; ControlPath /tmp/%u_%r@%h:%p; hostname localhost; port $FREE_PORT; user $TARGET_USER\" | tr ';' '\n' > /tmp/tmpsshrs"
# The ssh options that will setup the tunnel
TUNNEL="-R localhost:$FREE_PORT:$TARGET_ADDR_PORT"
echo
echo -n "Test: ssh to $SOURCE_HOST then to $TARGET_HOST: "
if ! ssh -A $TUNNEL $SOURCE_HOST "ssh -A -F /tmp/tmpsshrs tmpsshrs echo PASSED" | grep PASSED ; then
echo
echo "Direct authentication failed, will use plan #B:"
echo "Please open another terminal, execute the following command"
echo "and leave the session running until rsync finishes"
echo "(if you're asked for password use the one for $TARGET_USER@$TARGET_HOST)"
echo " ssh -t -A $TUNNEL $SOURCE_HOST ssh -F /tmp/tmpsshrs tmpsshrs"
read -p "Press [Enter] when done..."
fi
echo "Starting rsync"
ssh -A $TUNNEL $SOURCE_HOST "rsync -e 'ssh -F /tmp/tmpsshrs' $RSYNC_OPTS $SOURCE_PATH tmpsshrs:$TARGET_PATH"
echo
echo "Cleaning up"
ssh $SOURCE_HOST "rm /tmp/tmpsshrs"