অস্থায়ীভাবে / বিন / শ লিঙ্কটি পরিবর্তন করুন


9

আমার কাছে টুকরো টুকরো সফটওয়্যার রয়েছে যা /bin/shবাশ হওয়া দরকার , তবে উবুন্টুর জন্য ডিফল্ট হ'ল ড্যাশ এবং আমি এটি ডিফল্ট রাখতে চাই; আমি স্থায়ীভাবে এটিকে বাশে পরিবর্তন করতে চাই না।

এটি কি কোনও চলমান টার্মিনাল সেশনের জন্য পরিবর্তন করার কোনও উপায় আছে? সুতরাং এই টার্মিনালটিতে চলমান একটি প্রোগ্রাম /bin/shবাশের সাথে সংযুক্ত দেখতে পাবে কিন্তু বাকী সিস্টেমটি এখনও ড্যাশটি দেখতে পাবে? বা আমি সফটওয়্যারটি /bin/shবাশ হিসাবে দেখার জন্য কৌশলটি তৈরি করতে পারি না তা না হলেও?

আমি এই সফ্টওয়্যারটি লিখিনি এবং /bin/bashপরিবর্তে এটি ব্যবহার করতে হ্যাক করা /bin/shকোনও বিকল্প নয়।


2
আপনি এটিকে সাময়িকভাবে পরিবর্তন করতে পারেন - তবে (এএফআইএকে) সুযোগটি একক টার্মিনাল সেশনে সীমাবদ্ধ করে না। উদাহরণস্বরূপ দেখুন / বিন / শ একটি প্রতীকী লিঙ্ক যা / বিন /
বাশকে


7
আপনি যাই করুন না কেন, দয়া করে প্রশ্নে থাকা সফ্টওয়্যারটির বাগ হিসাবে এটি রিপোর্ট করুন। কারণ অভিমানী /bin/shহয় bash হয় একটি বাগ, এবং এটি প্রকৃত সমস্যার কারণ (যেমন আপনি খুঁজে খুঁজে বের করছি)। যদি কেউ অভিযোগ না করে তবে এটি কখনও পরিবর্তিত হতে পারে না।
মার্সেলেম

1
@ সার্জি কলোডিএজ্নি যদি বাগটি তাদের সমর্থন করে এমন একমাত্র প্ল্যাটফর্মে সমস্যা না তৈরি করে, তবে সম্ভবত তারা তা থেকে দূরে সরে যেতে পারে। যদিও এটি এখনও একটি বাগ।
মার্সেলেম

1
সফটওয়্যারটি জিলিনক্স নামে একটি "ছোট" সংস্থা প্রকাশ করেছে পেটালিনাক্স, এবং ডকুমেন্টেশন অনুসারে উবুন্টু 16.04 সমর্থিত (সেন্টোস এবং আরএইচইএল সহ), সুতরাং আমি এটির বাগটি বলতে চাই।
করভিন

উত্তর:


10

দুটি উত্তর ইতিমধ্যে ক্রুটিং এবং মাউন্ট বাঁধাইয়ের পরামর্শ দেয় এবং তৃতীয়, ঘনিষ্ঠভাবে সম্পর্কিত বিকল্প রয়েছে: মাউন্ট নেমস্পেসগুলিপ্রোগ্রামটি ব্যবহার করেunshare , আপনি একটি নতুন মাউন্ট নেমস্পেস তৈরি করতে পারেন এবং এই নেমস্পেসের মধ্যে থাকা মাউন্টগুলি অন্য নেমস্পেসগুলিকে প্রভাবিত করবে না।

উদাহরণস্বরূপ, একটি টার্মিনালে আমি করি:

muru|[0] ~ sudo unshare -m /bin/bash
root@muru-1604:~# sudo mount --bind /bin/bash /bin/sh
root@muru-1604:~# /bin/sh --version
GNU bash, version 4.4.18(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@muru-1604:~# sudo -iu muru
muru|[0] ~ /bin/sh --version  # propagates
GNU bash, version 4.4.18(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

এবং অন্যটিতে:

$ /bin/sh --version
/bin/sh: 0: Illegal option --

সুতরাং আপনি নিজের মাউন্ট নেমস্পেসে এই অবিচ্ছিন্ন প্রোগ্রামটি চালাতে পারেন।


14

এটি যদি কোনও স্ক্রিপ্ট হয় তবে কেবল স্ক্রিপ্টটিকে কল করুন

bash scriptname.sh

কোনও লিঙ্ক পরিবর্তন করার দরকার নেই।

সংকলিত এক্সিকিউটেবলের জন্য আপনি ক্রুট রুট যেতে পারেন:

mkdir rootfs
cp -a /usr rootfs/
cp -a /lib rootfs/
cp -a /lib64 rootfs/
cp /bin/bash  rootfs/bin/sh
cp yourprogram  rootfs/
sudo chroot rootfs  sh

এবং তারপরে আপনার প্রোগ্রামটি চালান বা or sudo chroot rootfs /yourprogram


যাইহোক, অনুশীলনে কোনও কারণ নেই যে আপনি /bin/bashএটিতে সিমলিংক হিসাবে ব্যবহার করতে পারবেন না /bin/sh। বস্তুত, সংস্করণ 6.10 পূর্বে উবুন্টু ব্যবহার করছিলেন /bin/bashযেমন /bin/sh, এবং তারপর তারা কারণে সুইচ /bin/shএকটি অনেক দ্রুত হচ্ছে POSIX এর গ্রিল প্রয়োগ, /bin/sh(যে, তার জন্য POSIX মান মেনে চলে কিভাবে অপারেটিং সিস্টেম ইউটিলিটি এবং OS আচরণ করা উচিত ইউনিক্সের মত এবং তাদের কিছু অভ্যন্তরীণ বাস্তবায়ন করুন) এবং বহনযোগ্যতার কারণে। কীভাবে কী হয়েছে সে সম্পর্কে historicalতিহাসিক নোটগুলির জন্য আমি গিলসের উত্তর পড়ার দৃ strongly়ভাবে পরামর্শ দিচ্ছি /bin/dash। সামঞ্জস্যতা হিসাবে, dashPOSIX বৈশিষ্ট্য ব্যবহার করার জন্য লিখিত স্ক্রিপ্টগুলি bashপুরোপুরি সূক্ষ্ম শেল হওয়ার সাথে চলবে । সাধারণত, এটি অন্যান্য উপায় যা সমস্যার সৃষ্টি করে -bashসিনট্যাক্স বা অ্যারেগুলির /bin/shমতো এমন বৈশিষ্ট্যগুলির প্রয়োজন নেই <<<যাগুলি প্রয়োজন হয় না ।

অধিকন্তু, প্রশ্নে থাকা কমান্ডটি সম্ভবত আরএইচইএল বা সেন্টোসকে মাথায় রেখে লেখা হয়েছে, যা /bin/bashসিমিলিংক হিসাবে ব্যবহার করে /bin/sh, দুটি বিষয় প্রস্তাব দেয়: তারা সম্ভবত নির্দিষ্ট ওএসকে লক্ষ্যবস্তু করেছিল এবং পসিক্স নীতিগুলি মেনে চলেনি। সেক্ষেত্রে কমান্ডটি কী কী প্রয়োজন তা যাচাই করে নেওয়াও ভাল ধারণা হবে কারণ এটি যদি অন্য ওএসের সাথে সত্যিই লেখা থাকে তবে আপনি কেবল পুনরায় সংযোগ স্থাপনের চেয়ে আরও সমস্যার মধ্যে পড়তে পারেন /bin/sh


2
হাঃ হাঃ হাঃ. জীবন এত সহজ হতে পারে :-)
পার্লডাক

1
আপনি আমার
উপার্জনটি

@ জোশুয়াবেসনেট ধন্যবাদ! আপনি আমার উত্তরটি দরকারী বলে খুশি
সের্গি কলডিয়াজহনি

3
+1 এবং অনুলিপিগুলির (পরিবর্তে lnবা এর cp -l) পরিবর্তে হার্ড লিঙ্কগুলি তৈরি করা ভাল ।
ডেভিড ফোস্টার

1
mount --rbind --make-rslaveবরং বিবেচনা করুন cp -r। কেবল পঠনযোগ্য পাশাপাশি তৈরি করা যায়। এছাড়াও sudo chrootরুট যা অনুকূল নাও হতে পারে যেমন স্ক্রিপ্ট চালানো হয়।
রোমান ওডাইস্কি

5

একটি সম্ভাবনা হ'ল একক ফাইলের বাইন্ড মাউন্ট । এই কাজের জন্য, আপনি মাউন্ট ফাইল /bin/bashমাত্র ওভার /bin/dash তাই bashসাজানোর কভার বা চামড়া এর dash। এখানে পদক্ষেপগুলি (বিপরীত সহ):

root@myhost:~# cd /bin

# situation before (bash and dash are different):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 bash
-rwxr-xr-x 1 root root  121432 Jan 25  2018 dash
lrwxrwxrwx 1 root root       4 Jul 13 11:38 sh -> dash
...

# mount /bin/bash over /bin/dash:
root@myhost:/bin# mount --bind /bin/bash /bin/dash

# situation now (bash and dash are the same):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 bash
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 dash
lrwxrwxrwx 1 root root       4 Jul 13 11:38 sh -> dash
...

# Now everything that runs `/bin/sh` in fact uses `/bin/bash`.

# check what the symlink "sh" says:
root@myhost:/bin# sh --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
...

# undo the mount:
root@myhost:/bin# umount /bin/dash 

# situation now (bash and dash are different again):
root@myhost:/bin# ls -l *sh*
-rwxr-xr-x 1 root root 1113504 Apr  4 20:30 bash
-rwxr-xr-x 1 root root  121432 Jan 25  2018 dash
lrwxrwxrwx 1 root root       4 Jul 13 11:38 sh -> dash
...

# check what the symlink "sh" now says:
root@myhost:/bin# sh --version
sh: 0: Illegal option --

যদিও আমি mount --bind /bin/bash /bin/shসরাসরি সিমলিংকটি আড়াল করার চেষ্টা করিনি । উপরের mountকৌশলটি কেবল বাশ এবং ড্যাশকে অভিন্ন করে তোলে যাতে এটি shনির্দেশ করে bashতবে dash। এছাড়াও, এটি কেবলমাত্র বর্তমান টার্মিনাল উইন্ডোর জন্য নয়, এটি সিস্টেম-ব্যাপী সমাধান।


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


1

আপনার একটি উপনাম ব্যবহার করে কেবল বর্তমান সেশনের জন্য এটি পরিবর্তন করতে সক্ষম হওয়া উচিত। টার্মিনালে আপনার কমান্ড চালানোর আগে:

alias sh=bash

এটি অস্থায়ী এবং কেবলমাত্র টার্মিনালটিতে এটি কার্যকর হয়েছিল in

তবুও: যদি আপনার স্ক্রিপ্টটি নিখুঁত পাথ ব্যবহার করে তবে এটি কাজ করবে না।

যেমনটি ভাল ধারণা, তবে যদি সফ্টওয়্যারটি সরাসরি / বিন / এসকে একটি স্পষ্ট পথের নাম দিয়ে কল করে, এটি কার্যকর হবে না। যাইহোক, সেই সফ্টওয়্যারটি এমন অনুমানগুলি তৈরি করে খুব সঠিকভাবে নকশাকৃত বলে মনে হয় না। আমি সম্ভবত এটি কোনও স্ক্রিপ্ট থেকে চালিত করব যা সঠিক পরিবেশ প্রস্তুত এবং পুনরায় সেট করতে যদি আমার কিছুটা ব্যবহার করতে হয়। - ভেনিয়াম

দুর্ভাগ্যক্রমে, স্ক্রিপ্টটি "হ্যাকিং" আপনার একমাত্র বিকল্প হতে পারে। @ ওয়ানডিয়ামের সাথে প্রতি কনভো, আপনি এই জাতীয় একটি মোড়ক স্ক্রিপ্ট তৈরি করতে পারেন:

#!/bin/bash
sudo ln -sf /bin/bash /bin/sh
/run/my/script
sudo ln -sf /bin/dash /bin/sh

তবে, আপনার স্ক্রিপ্টের সময়কালে আপনার সিস্টেমে কোনও কিছুই স্পষ্টভাবে ড্যাশ লাগবে না আশা করি।


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

আপনি পরিবেশ তৈরিতে কীভাবে যাবেন তা জানতে আগ্রহী হব। আপনি কি ক্রুট ব্যবহার করবেন?
জোশুয়া বেসিনিটি

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

প্রতীকী লিঙ্কটি সরিয়ে নিয়ে যখন অন্য কোনও কিছুর দরকার পড়ে তবে কী ঘটবে .... LN -sf / bin / bash / bin / sh এর মত কিছু যখন শুরু হয় এবং ln -sf / বিন / ড্যাশ / বিন / sh করা হয়?
জোশুয়া বেসনিট

লিঙ্কটি পরিবর্তন করা গেলে বেশিরভাগ অন্যান্য প্রক্রিয়াগুলি সম্ভবত ড্যাশের পরিবর্তে খুশিতে ব্যাশ ব্যবহার করবে। হ্যাঁ, এই নিরর্থক, তবে বর্তমান পরিস্থিতির নকল করার জন্য, আমি আপেক্ষিক লিঙ্কগুলি তৈরি করব, অর্থাত "সিডি / বিন; এলএন-এসএফ বাশ শ", তবে এটি সম্ভবত একটি পিউরিস্ট বিশদ যা বাস্তবে কোনও বিষয় নয়।
ভেনেডিয়াম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.