sudo
මුරපදයක් නොමැතිව ධාවනය කිරීමට මා වින්යාස කර ඇත, නමුත් මම උත්සාහ කරන විට ssh 'sudo Foo'
, මට තවමත් දෝෂ පණිවිඩය sudo: sorry, you must have a tty to run sudo
ලැබේ.
මෙය සිදුවන්නේ ඇයි සහ මම එය වටා වැඩ කරන්නේ කෙසේද?
sudo
මුරපදයක් නොමැතිව ධාවනය කිරීමට මා වින්යාස කර ඇත, නමුත් මම උත්සාහ කරන විට ssh 'sudo Foo'
, මට තවමත් දෝෂ පණිවිඩය sudo: sorry, you must have a tty to run sudo
ලැබේ.
මෙය සිදුවන්නේ ඇයි සහ මම එය වටා වැඩ කරන්නේ කෙසේද?
Answers:
එය ඔබගේ /etc/sudoers
ගොනුවට (හෝ එයට ඇතුළත් ඕනෑම ගොනුවකට) ඇති නිසා විය හැකිය:
Defaults requiretty
... එමඟින් sudo
TTY අවශ්ය වේ. Red Hat පද්ධති (RHEL, Fedora ...) පෙරනිමි sudoers
ගොනුවේ TTY අවශ්ය බව දන්නා කරුණකි . එමඟින් සැබෑ ආරක්ෂක ප්රතිලාභයක් නොලැබෙන අතර ආරක්ෂිතව ඉවත් කළ හැකිය.
Red Hat ගැටළුව පිළිගෙන ඇති අතර එය අනාගත නිකුතුවලදී ඉවත් කරනු ඇත.
සේවාදායකයේ වින්යාසය වෙනස් කිරීම විකල්පයක් නොවේ නම්, එම වැරදි වින්යාසය සඳහා වැඩක් ලෙස, ඔබට දුරස්ථ පැත්තේ ව්යාජ පර්යන්තයක් ඇති කරන විකල්ප -t
හෝ -tt
විකල්ප භාවිතා කළ හැකිය ssh
, නමුත් එයට පැති ගණනාවක් ඇති බවට පරිස්සම් වන්න බලපෑම්.
-tt
යනු අන්තර්ක්රියාකාරී භාවිතය සඳහා ය. එය raw
දුරස්ථ පර්යන්තය සමඟ අන්තර් ක්රියා කරන පරිදි දේශීය පර්යන්තය ප්රකාරයට දමයි . එයින් අදහස් වන්නේ ssh
I / O පර්යන්තයක සිට / නොවේ නම්, එය අතුරු ආබාධ ඇති කරන බවයි. උදාහරණයක් වශයෙන්, සියලු ආදාන, නැවත විශේෂ පර්යන්තය චරිත ප්රතිරාවය කරනු ලැබේ ( ^?
, ^C
, ^U
) විශේෂ සැකසුම් හේතුවන බවත්; ප්රතිදානය මත, LF
s වෙත පරිවර්තනය වනු ඇත CRLF
බලන්න ගේ ... ( මෙම පිළිතුර ඇයි මේ ද්විමය ගොනුව වෙනස් වන්නේ කෙසේද? වේ වැඩි විස්තර සඳහා.
බලපෑම අවම කිරීම සඳහා, ඔබට එය පහත පරිදි කළ හැකිය:
ssh -tt host 'stty raw -echo; sudo ...' < <(cat)
මෙම < <(cat)
දේශීය පර්යන්තය (අවශ්ය නම් පමණක්) පිහිටුවීමට මග හරිනු ඇත raw
ප්රකාරය. stty raw -echo
දුරස්ථ පර්යන්තයේ රේඛීය විනය පසුකර යන ලෙස සැකසීමට අපි භාවිතා කරමු (effectively ලදායී ලෙස එය ව්යාජ පර්යන්තයක් වෙනුවට භාවිතා කරන නළය මෙන් ක්රියා කරයි -tt
, නමුත් එය අදාළ වන්නේ එම විධානය ක්රියාත්මක වීමෙන් පසුව පමණි, එබැවින් ඔබට අවශ්යය එය සිදු වන තුරු ආදානය සඳහා යමක් යැවීම ප්රමාද කිරීමට).
දුරස්ථ විධානයේ ප්රතිදානය පර්යන්තයකට යන බැවින්, එය තවමත් එහි බෆරයට (බොහෝ යෙදුම් සඳහා රේඛීය පදනම් වනු ඇත) සහ කලාප පළල කාර්යක්ෂමතාවයට බලපාන බව සලකන්න TCP_NODELAY
. එසේම -tt
, ssh
IPQoS lowdelay
ප්රතිවිරුද්ධ ලෙස සකසයි throughput
. ඔබට මේ දෙකම සමඟ වැඩ කළ හැකිය:
ssh -o IPQoS=throughput -tt host 'stty raw -echo; sudo cmd | cat' < <(cat)
එසේම, එයින් අදහස් කරන්නේ දුරස්ථ විධානයට එහි stdin හි ගොනුවේ අවසානය හඳුනාගත නොහැකි බවත් දුරස්ථ විධානයෙහි stdout සහ stderr තනි ප්රවාහයකට ඒකාබද්ධ කරන බවත්ය.
ඒ නිසා, එතරම් හොඳ කාර්යයක් නොවේ.
ඔබ (සමග මෙන් දුරස්ථ ධාරකය මත ව්යාජ පර්යන්තය අභිභවනය කිරීමට ක්රමයක් තියෙනවා නම් expect
, zsh
, socat
, perl
ගේ IO::Pty
...), පසුව එය අනුයුක්ත කිරීමට ව්යාජ පර්යන්තය නිර්මාණය කිරීමට භාවිතා කිරීමට වඩා හොඳ වනු ඇත sudo
කිරීමට (නමුත් I / O සඳහා නොවේ), සහ ssh
නොමැතිව භාවිතා කරන්න -t
.
උදාහරණයක් ලෙස, සමඟ expect
:
ssh host 'expect -c "spawn -noecho sh -c {
exec sudo cmd >&4 2>&5 <&6 4>&- 5>&- 6<&-}
exit [lindex [wait] 3]" 4>&1 5>&2 6<&0'
හෝ සමඟ script
(මෙහි සිට ක්රියාත්මක කිරීම උපකල්පනය කරමින් util-linux
):
ssh host 'SHELL=/bin/sh script -qec "
sudo cmd <&3 >&4 2>&5 3<&- 4>&- 5>&-
" /dev/null 3<&0 4>&1 5>&2'
((දෙකම සඳහා) දුරස්ථ පරිශීලකයාගේ පිවිසුම් කවචය බෝර්න් වැනි යැයි උපකල්පනය කරයි).
පෙරනිමියෙන්, SUDO TTY අවශ්ය වන පරිදි සකසා ඇත. එනම්, SUDO පිවිසුම් කවචයකින් ධාවනය කිරීමට අපේක්ෂා කෙරේ. -t
ඔබේ SSH ආයාචනයට ස්විචය එක් කිරීමෙන් ඔබට මෙම අවශ්යතාව පරාජය කළ හැකිය :
ssh -t someserver sudo somecommand
මෙම -t
ව්යාජ tty වෙත බලවේග වෙන්.
ඔබට මෙය ගෝලීයව සිදු කිරීමට අවශ්ය නම්, /etc/sudoers
නියම කිරීමට වෙනස් කරන්න !requiretty
. මෙය එක් පරිශීලකයෙකුට, කණ්ඩායමකට හෝ සියල්ල ඇතුළත් වන මට්ටමකින් කළ හැකිය.
Tty වෙන් කිරීම බල කිරීම සඳහා -t
ධජය භාවිතා කරන්න ssh
.
$ ssh luci tty
not a tty
$ ssh luci -t tty
/dev/ttys003
$
-t
බලහත්කාරයෙන් වෙන් කිරීම සඳහා තත්පරයක් එක් කරන්නPseudo-terminal will not be allocated because stdin is not a terminal.
මම ඩොකර් සහ සෙන්ටෝස් 7 භාවිතා කරමින් මෙම ගැටලුවට මුහුණ දුන්නා. මම පහත සඳහන් දේ කළා.
yum install -y sudo
sed -i -e 's/Defaults requiretty.*/ #Defaults requiretty/g' /etc/sudoers
මට මෙම හැක් එක https://hub.docker.com/r/liubin/fluentd-agent/~/dockerfile වෙතින් හමු විය
සිත්ගන්නා විකල්පයක් නම් ඔබේ පරිශීලකයින් සහ සුඩෝ නීති කළමනාකරණය කිරීම සඳහා FreeIPA හෝ IdM ධාවනය කිරීමයි. එවිට ඔබට සුඩෝ රීති නිර්මාණය කර විකල්පය පැවරිය හැකිය
අවශ්යතාවය
රීතිය තුළ. එවිට විධානය අපේක්ෂිත පරිදි ක්රියාත්මක වේ. සියලුම සේවාදායකයන් සහ පරිශීලකයින් තනි වින්යාස සමූහයකින් කළමනාකරණය කිරීමේ ප්රතිලාභද ඔබට ඇත.
මටත් ඒ ප්රශ්නයම තිබුණා. මගේ නඩුවේදී, විසඳුම පේළි දෙකක් විය
myscript=$(cat ssh_test.sh)
ssh -t user@host "$myscript"
පැහැදිලි කිරීම:
ඔබට ක්රියාත්මක කිරීමට අවශ්ය විධාන (සුඩෝ විධාන ඇතුළුව) ස්ක්රිප්ටයක් තුළ තබන්න උදා: "ssh_test.sh".
මුළු පිටපතම "myscript" නමින් විචල්යයකට කියවන්න.
Ssh එක -t සමඟ ආයාචනා කර විධානය වෙනුවට විචල්යය සපයන්න.
මෙයට පෙර, මම stdin වෙතින් කියවීමේ සංයෝජන සහ හෙරොඩොක්ස් භාවිතා කරමින් ගැටළු වලට මුහුණ දුන්නා
requiretty
ප්රකෘති sudoers දී. එය නව නිකුතුවලදී සවි කෙරෙනු ඇත