Sftp না ভঙ্গ করে .bashrc ব্যবহার করুন


20

আমার সমস্যাটি হ'ল প্রতিবার এসএসএস শেলটিতে লগইন করার সময় আমাকে কয়েকটি ভেরিয়েবল সেট করতে হবে এবং কয়েকটি লাইন আউটপুট করতে হবে এবং একই সাথে আমাকে ফাইলজিলার মাধ্যমে ফাইলগুলি টর্নফার করতে sftp ব্যবহার করতে সক্ষম হতে হবে।

এখন, http://www.openssh.org/faq.html- র ওপেনশ্যাফএএইকিউ অনুসারে , যদি আপনার স্টার্টআপ স্ক্রিপ্টগুলি কোনও ধরণের আউটপুট প্রতিধ্বনিত করে তবে এটি এসএফটিপি দিয়ে মেসেজ করে। সুতরাং এটি হয় অনির্দিষ্টকালের জন্য বিলম্ব করে, বা একটি "প্রস্থান কোড 128 সহ সার্ভার দ্বারা সংযোগ বন্ধ করা" এর মাধ্যমে ত্রুটি।

আমি .bashrc .bash_profile এ সরানো বা .বাশার্কে নিম্নলিখিত কোড ব্যবহার করার মতো সমাধানগুলি চেষ্টা করেছি:

if [ "$TERM" != "dumb" ]
then
   source .bashc_real
fi

এবং:

if [ "$TERM" = "xterm" ]
then
   source .bashc_real
fi

যাইহোক, কিছুই কাজ করে না। আমার শেল টার্মিনালটি বাশ, এবং আমি ফাইলজিলার সাথে এসফটিপিতে সংযোগ করব।

উত্তর:


23

পরিবর্তে এটি করার চেষ্টা করুন

if [ "$SSH_TTY" ]
then
   source .bashc_real
fi

17

মাইকের উত্তর সম্ভবত কার্যকর হবে। তবে এটি উল্লেখ করার মতো যে আপনি ভার্চোজের স্টাফটি কোন স্টার্টআপ ফাইলগুলিতে রাখতে হবে তা নির্বাচন করে সাবধানতার সাথে সম্পন্ন করতে পারেন the ব্যাশ ম্যান পৃষ্ঠা থেকে:

যখন বাশকে একটি ইন্টারেক্টিভ লগইন শেল হিসাবে, বা - লগিন বিকল্পের সাথে একটি অ-ইন্টারেক্টিভ শেল হিসাবে ডাকা হয়, এটি প্রথমে ফাইল / ইত্যাদি / প্রোফাইল থেকে কমান্ডগুলি পড়ে এবং কার্যকর করে, যদি সেই ফাইলটি বিদ্যমান থাকে। এই ফাইলটি পড়ার পরে, এটি সেই ক্রমে ash / .bash_profile, ~ / .bash_login, এবং ~ /। প্রোফাইলে অনুসন্ধান করে এবং উপস্থিত এবং পঠনযোগ্য যা প্রথমটি থেকে আদেশগুলি পড়ে এবং কার্যকর করে। শেলটি এই আচরণটি আটকাতে শুরু করা হলে --noprofile বিকল্পটি ব্যবহার করা যেতে পারে।

লগইন শেল নয় এমন একটি ইন্টারেক্টিভ শেলটি শুরু করা হলে, ফাইলটি যদি উপস্থিত থাকে তবে ash / .bashrc থেকে আদেশগুলি পড়ে এবং কার্যকর করে। এটি --norc বিকল্প ব্যবহার করে বাধা দেওয়া হতে পারে। --Rcfile ফাইল অপশনটি বাশকে from / .bashrc এর পরিবর্তে ফাইল থেকে আদেশগুলি পড়তে এবং সম্পাদন করতে বাধ্য করবে।

Sftp / scp সরঞ্জামগুলি একটি ইন্টারেক্টিভ নন-লগইন শেল শুরু করে, সুতরাং .brcrc উত্সাহিত হবে। অনেকগুলি বিতরণ উত্স .bash_profile বা বিপরীতে থেকে .Bashrc, যাতে এটি বিভ্রান্তি পেতে পারে। আপনার লগইন পরিবেশের পরিষ্কার-পরিচ্ছন্নতার পরীক্ষা করার জন্য একটি ভাল কৌশল হ'ল একটি কমান্ড দিয়ে স্ল্যাশ করা, যা একইভাবে scp / sftp সংযোগের অনুকরণ করে। উদাহরণস্বরূপ: ssh myhost /bin/truescp / sftp তারা সংযুক্ত হওয়ার পরে ঠিক কী দেখায় তা আপনাকে দেখাবে।

একটি সাধারণ ডেমো:

insyte@mazer:~$ echo "echo Hello from .profile" > .profile
insyte@mazer:~$ echo "echo Hello from .bashrc" > .bashrc

sazerac:~ insyte$ ssh mazer /bin/true
Hello from .bashrc
sazerac:~ insyte$

insyte@mazer:~$ rm .bashrc

sazerac:~ insyte$ ssh mazer /bin/true
sazerac:~ insyte$

প্রথম পরীক্ষার ফলে scp / sftp / rsync ইত্যাদির বিরতি ঘটবে। দ্বিতীয় সংস্করণটি ঠিক কাজ করবে।


আমরা স্বীকার করি না যে "sftp / scp সরঞ্জামগুলি একটি ইন্টারেক্টিভ নন-লগইন শেল শুরু করে" যেহেতু আমরা সত্যিকার অর্থে শেলের সাথে ইন্টারঅ্যাক্ট করতে পারি না । কিন্তু আমি বুঝতে পারছি না কেন .bashrcজন্য source'd হবে scpবা ssh host command
পাইনেজজ

2
"ইন্টারেক্টিভ" শব্দটি বিষয়গত নয়। এটি ব্যাশ দ্বারা ব্যবহৃত একটি শব্দ যার শুরুতে মোডগুলির একটি বর্ণনা করতে পারে। এটি সত্য যে এসএফটিপি / এসসিপি একটি "ইন্টারেক্টিভ নন-লগইন শেল" শুরু করে। বিকাশকারীদের সাথে সোর্সিং না হয় কিনা তা নিয়ে নির্দ্বিধায় দ্বিধা বোধ করবেন না ash আমি আপনাকে বলছি এটি কী করে।
Insyte

2
Bashঅনুরোধ করা scpবা ssh host commandপ্রকৃতপক্ষে অ-ইন্টারেক্টিভ । আমি এটি সবেমাত্র ব্যাশ ম্যানুয়ালে পেয়েছি: "বাশ এটি নির্ধারণের চেষ্টা করে যে এটি কখন একটি নেটওয়ার্ক সংযোগের সাথে সংযুক্ত তার স্ট্যান্ডার্ড ইনপুট দিয়ে চালিত হচ্ছে , যেমন রিমোট শেল ডিমন দ্বারা চালিত হয়, সাধারণত আরএসডি করা হয়, বা সুরক্ষিত শেল ডিমন এসএসএসডি যদি বাশ নির্ধারণ করে তবে এটি এই ফ্যাশনে পরিচালিত হচ্ছে ~/.bashrc, যদি ফাইলটি বিদ্যমান থাকে এবং পাঠযোগ্য হয় তবে এটি কমান্ডগুলি পড়ে এবং কার্যকর করে । " এখানে আকর্ষণীয় ইতিহাস
pynexj

1
এছাড়াও অধ্যায় দেখুন রিমোট অ লগইন অ মিথস্ক্রিয় শেল মধ্যে এই উইকি পাতা
pynexj

3

আপনি যদি csh ব্যবহার করছেন:

if ($?prompt)
  ... interactive stuff ...

এবং যদি এটি বাশ:

if [[ $- == *i* ]]; then
  ... interactive stuff ...
fi

বা বিকল্পভাবে ব্যাশ নিয়মিত এক্সপ্রেশন ব্যবহার করে:

if [[ $- =~ i ]]; then
  ... interactive stuff ...
fi

এই রেখাগুলি এমন লাইনগুলির পূর্বে হওয়া উচিত যেখানে আপনি কোনও কিছু পিছনে আউটপুট / প্রতিধ্বনি করেন।


হাই, আপনি কোড ব্যাখ্যা করতে পারেন, দয়া করে। আমি জানি $? পূর্ববর্তী কমান্ডের রিটার্ন স্তর। যদিও আমি prom? প্রম্পট এবং understand - বুঝতে পারি না। নাকি সিএস নির্দিষ্ট?
জোয়েল জি ম্যাথিউ

1
@Droidzone: $?varমধ্যে cshআয় 1 যদি varসংজ্ঞায়িত করা হয় এবং 0 অন্যথায়। $-মধ্যে bashহায় হয়েছে iতার মান গৃহস্থালির কাজ যদি শেল ইন্টারঅ্যাকটিভ।
পাইনেজজ

উত্তরটি আপডেট করতে হবে explain - শেল বিকল্পগুলির একটি বিশেষ চলক। দেখতে stackoverflow.com/questions/5163144/...
maninvan

1

মাইকের সমাধানটি আমার পক্ষেও কাজ করেছিল। তবে যেহেতু আমার ডিফল্ট শেল টিসিএসএইচ, তাই আমাকে নিম্নরূপে ফিক্সটি সম্পাদনা করতে হবে (.tcshrc এ):

if ( $?SSH_TTY ) then
    exec /bin/bash
endif

ভেবেছিলাম সবার সুবিধার্থে ভাগ করে নেব।


0

আমি এখানে উল্লিখিত অন্যান্য সমাধানগুলির মধ্যে কিছু পছন্দ করি, তবে আমি ভেবেছিলাম যে আমার সমাধানটি আমি আমার ব্যাশ এবং সিএসএস ভিএমগুলিতে আমার স্টার্টআপ স্ক্রিপ্টগুলিতে প্রতিধ্বনি আদেশের কারণে এসএফটিপি সংযোগ রোধ করতে রোধ করতে ব্যবহার করছি, যদি কেউ তথ্যকে সহায়ক বলে মনে করে। ।

বেসে:

if [ $TERM == "xterm" ] || [ $TERM == "xterm-256color" ]; then
  echo "Xterm display identified: echo enabled"
  echo_disable="0"
else
  echo_disable="1"
fi

# Use the following for all subsequent echo commands
if [ $echo_disable == 0 ]; then
 echo "Safe to display on Xterm"
fi

সিএসএসে:

if ($TERM == "xterm") then
  echo "Xterm display identified: echo enabled"
  set echo_disable = "0"
else
  set echo_disable = "1"
endif

# Use the following for all subsequent echo commands
if !( "$echo_disable" ) echo "Safe to display on Xterm"

এটি কিছুটা নিষ্ঠুর শক্তি, তবে এটি কার্যকর হয়।


আমি উপরের ["$ SSH_TTY"] কোডটি ব্যবহার করার চেষ্টা করেছি এবং দেখেছি এটি কেবল পুট্টির মতো সাধারণ ক্লায়েন্ট প্রোগ্রামগুলির জন্য কাজ করে। যখন আমি NoMachine ব্যবহার করি এটি কোনও আউটপুট সরবরাহ করে না। এজন্য আমাকে উপরের কোডে "xterm-256 রঙ" অন্তর্ভুক্ত করা দরকার needed
বব নুনন

আকর্ষণীয়ভাবে যথেষ্ট, "যদি ($? SSH_TTY) তখন" ব্যবহার করেও আমার সিএসএস ভিএম ব্যবহার করে না। আমি পরীক্ষা করে দেখেছি এবং এখানে কোনও এসএসএইচটিটিওয়াই এনভায়রনমেন্ট ভেরিয়েবল সংজ্ঞায়িত হয়নি। সুতরাং উপরের আমার কোডটি অন্যদের ক্ষেত্রেও একইরকম পরিস্থিতিতে সহায়ক হতে পারে।
বব নুনন

0

এখানে আমার (ডিফল্ট) .bashrcফাইলের প্রথম লাইন রয়েছে :

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

একটি ইন্টারেক্টিভ সেশনের জন্য চেক এসসিপি, এসএফটিপি বা ssh remote-host commandমোডের সাথে বিশৃঙ্খলা এড়ায় ।

এটি ছাড়াই, যদি আপনার ফাইল স্টাডাউটে মুদ্রণ .bashrcব্যবহার করে echoবা অন্য কিছু স্টাফ ব্যবহার করে তবে আপনি এই ধরণের ত্রুটি পেতে পারেন:

  • এসএফটিপি: Received message too long 168435779
  • এসসিপি: protocol error: unexpected <newline>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.