শেল স্ক্রিপ্টের ভিতরে su ব্যবহার করে


12

আমি একটি মোতায়েন প্রক্রিয়া স্বয়ংক্রিয় করছি এবং আমি আমার মেশিনে কেবল একটি .sh ফাইল কল করতে সক্ষম হতে চাই, এটি আমার বিল্ডটি করতে এবং সার্ভারে .zip আপলোড করতে হবে এবং তারপরে সার্ভারে প্রচুর স্টাফ তৈরি করবে। আমার যা করতে হবে তার একটির জন্য আমার মূল হতে হবে। সুতরাং, আমি যা করতে চাই তা হ'ল:

ssh user@172.1.1.101 <<END_SCRIPT
su - 
#password... somehow...
#stop jboss
service server_instance stop
#a bunch of stuff here
#all done!
exit
END_SCRIPT

এটা কি সম্ভব?


+1 ভাল প্রশ্ন। সাধারন সমস্যা.
gMale

উত্তর:


15

আপনি কি পরিবর্তে একটি পাসওয়ার্ড-কম sudo বিবেচনা করেছেন?


1
আমি অতীতে এই পদ্ধতির ব্যবহার করেছি। আপনি প্রয়োজনীয় কমান্ডগুলিতে সুডো সীমাবদ্ধ করতে পারেন (পরিষেবাটি শুরু / বন্ধ করুন), ব্যবহারকারীকে আপনার প্রয়োজনীয় সুযোগগুলি সুনির্দিষ্টভাবে সীমাবদ্ধ করতে হবে iting এটি এখনও clunky বোধ, কিন্তু কাজ করে।
চিহ্নিত করুন

এটি আসলে আমি শেষ
করেই

5

Su এর পরিবর্তে, উপযুক্ত কমান্ড (গুলি) এর জন্য sudoers এ সেট করা NOPASSWD এর সাথে sudo ব্যবহার করুন। আপনি অনুমতিপ্রাপ্ত কমান্ডটিকে যতটা সম্ভব সীমাবদ্ধ করতে চান। এটির কাছে রুল কমান্ডগুলির জন্য স্ক্রিপ্ট চালানো বলা সবচেয়ে পরিষ্কার উপায় হতে পারে এবং আপনি যদি সুডোর ফাইল সিনট্যাক্সের সাথে অপরিচিত থাকেন তবে নিরাপদ করা সবচেয়ে সহজ উপায়। যে কমান্ডগুলি / স্ক্রিপ্টগুলির জন্য পুরো পরিবেশটি বোঝাই হওয়া দরকার, sudo su - -c commandসেগুলি ওভারকিলের পরেও কাজ করে।



3

আপনি সার্ভারে এই কমান্ডটি চালানোর জন্য এসএসএইচের পক্ষে একটি আর্গুমেন্ট হিসাবে পাস করতে পারেন এবং তারপরে প্রস্থান করতে পারেন:

ssh user@host "command to run"

এটি একাধিক কমান্ডের তালিকার জন্যও কাজ করে:

ssh user@host "command1; command2; command3"

বা বিকল্পভাবে:

ssh user@host "
        command1
        command2
        command3
"

অন্য ব্যবহারকারীরা যেমন আমার আগে ইঙ্গিত করেছেন, suসার্ভারে চললে স্ক্রিপ্টের পরবর্তী কমান্ডগুলি রুট হিসাবে কার্যকর করার পরিবর্তে একটি নতুন শেল চালু করা হবে। আপনার যা করা দরকার তা হ'ল হয় sudoবা ব্যবহার করতে su -cএবং টিটিওয়াই বরাদ্দকে জোর করে এসএসএইচে -tস্যুইচ দিয়ে (আপনার যদি রুট পাসওয়ার্ড দেওয়ার প্রয়োজন হয় তবে):

ssh -t user@host 'su - -c "command"'
ssh -t user@host 'sudo command'

সব মিলিয়ে আপনি যা করতে চান তা সম্পাদনের একটি উপায় হ'ল:

#!/bin/bash
ssh -t user@172.1.1.101 "
        sudo some_command
        sudo service server_instance stop
        sudo some_other_command
"

যেহেতু sudoসাধারণত রুট পাসওয়ার্ড জিজ্ঞাসা করার আগে কয়েক মিনিটের জন্য আপনাকে অনুমোদনের স্তরটি সাধারণত স্মরণ করা হয়, কেবল sudoআপনাকে রুট হিসাবে চালানো সমস্ত কমান্ডের প্রস্তুতি নেওয়া সার্ভারের রুট হিসাবে কমান্ড চালানোর সম্ভবত সহজতম উপায়। NOPASSWDআপনার ব্যবহারকারীর জন্য একটি বিধি যুক্ত করা /etc/sudoersপ্রক্রিয়াটিকে আরও মসৃণ করে তুলবে।

আশা করি এটা কাজে লাগবে :-)


এই NOPASSWDনিয়মটি যুক্ত করার জন্য যদি আপনার আরও তথ্যের প্রয়োজন হয় তবে নীচের অংশে উদাহরণগুলি দেখুন man sudoers। এছাড়াও, বিরতি এড়াতে visudoআপনার sudoersফাইল সম্পাদনা করার সময় ব্যবহার করতে ভুলবেন না!
জবিরালি

আমি কাজ করতে su - -c "কমান্ড" পেতে পারি না। আমি su এর জন্য পাসওয়ার্ডটি কীভাবে সরবরাহ করব?
সেমিসকোলোহ

আপনি যদি এর su -cপরিবর্তে ব্যবহার করতে চান তবে আপনার পতাকাটি sudoদিয়ে এসএসএইচ চালানো উচিত -t- কমান্ড কার্যকর হওয়ার পরে আপনাকে সার্ভারে মূল পাসওয়ার্ডের জন্য অনুরোধ করা হবে। suকমান্ড লাইন আর্গুমেন্ট হিসাবে সরাসরি একটি পাসওয়ার্ড সরবরাহ করা সমর্থনযোগ্য নয় (যতদূর আমি জানি) বা সুপারিশ করা হয় না - যেহেতু একটি সাধারণ ps -ef | grep susu
কমান্ডলাইন

আপনি কীভাবে su -cssh -t user@host 'su -lc "echo this is a test echo this is another test"'
এসএসএইচকে অনুরোধ করছেন

<br />আপনার স্ক্রিপ্টের নতুন লাইনের সাথে উপরেরটি প্রতিস্থাপন করুন । অফ-টপিক: আপনি সার্ভারফল্ট মন্তব্যে নতুন লাইন যুক্ত করতে পারবেন? কোড স্নিপেটগুলি পোস্ট করার সময় এটি বেশ কার্যকর হবে ...
জবিরালি

2

না। আপনি যদি পাসওয়ার্ডটি পেয়ে থাকেন su, তবুও আপনাকে এমন সত্যটি মোকাবেলা suকরতে হবে যা একটি নতুন শেল খুলবে, যার অর্থ আপনার পরবর্তী কমান্ডগুলি এতে পাস হবে না। কার্যকর সহায়তার সাথে আপনাকে রুট ক্রিয়াকলাপগুলির জন্য একটি স্ক্রিপ্ট লিখতে হবে যা এটি উপযুক্ত সুযোগ-সুবিধাগুলির সাথে অনুরোধ করতে পারে।


2
বেশিরভাগ su কমান্ডগুলি -c বিকল্পটি গ্রহণ করে যা কমান্ড (গুলি) চালাতে একটি আর্গুমেন্ট হিসাবে গ্রহণ করবে। আমি একমত যে সার্ভারে একটি স্ক্রিপ্ট সম্ভবত সেরা বনাম। এসএসএসের মাধ্যমে সমস্ত সেন্টিমিডি প্রেরণ করা।
অ্যারন বুশ

1

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

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

গাইড হিসাবে এখানে একটি ভাল লিঙ্ক: http://bash.cyberciti.biz/security/expect-ssh-login-script/

কেবল সাইটটি নেমে গেলে:

#!/usr/bin/expect -f
# Expect script to supply root/admin password for remote ssh server
# and execute command.
# This script needs three argument to(s) connect to remote server:
# password = Password of remote UNIX server, for root user.
# ipaddr = IP Addreess of remote UNIX server, no hostname
# scriptname = Path to remote script which will execute on remote server
# For example:
#  ./sshlogin.exp password 192.168.1.11 who
# ------------------------------------------------------------------------
# Copyright (c) 2004 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ----------------------------------------------------------------------
# set Variables
set password [lrange $argv 0 0]
set ipaddr [lrange $argv 1 1]
set scriptname [lrange $argv 2 2]
set arg1 [lrange $argv 3 3]
set timeout -1
# now connect to remote UNIX box (ipaddr) with given script to execute
spawn ssh root@$ipaddr $scriptname $arg1
match_max 100000
# Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof

1

আমি জানি যে এটি কিছুটা দেরি হয়েছে তবে আমি ব্যক্তিগতভাবে নেট :: এসএসএইচ :: প্রত্যাশা, সিপিএএন থেকে উপলব্ধ ব্যবহার করব।

http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod


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

0

আপনি 'ssh example.com su -lc "$ cmd" "ব্যবহার করতে পারেন।

কমান্ডে বিকল্পগুলি থাকে, আপনি এটি উদ্ধৃত করতে হবে, অন্যথায় "su" সেগুলি খেতে পারে ("su: অবৈধ বিকল্প - 'এ')।

ssh -AX -tt example.com 'su -lc "tmux new-session -A"'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.