මුරපදයක් නොමැතිව මට sudo කළ හැකි නම් මට sudo ධාවනය කිරීමට tty අවශ්‍ය වන්නේ ඇයි?


229

sudoමුරපදයක් නොමැතිව ධාවනය කිරීමට මා වින්‍යාස කර ඇත, නමුත් මම උත්සාහ කරන විට ssh 'sudo Foo', මට තවමත් දෝෂ පණිවිඩය sudo: sorry, you must have a tty to run sudoලැබේ.

මෙය සිදුවන්නේ ඇයි සහ මම එය වටා වැඩ කරන්නේ කෙසේද?

Answers:


294

එය ඔබගේ /etc/sudoersගොනුවට (හෝ එයට ඇතුළත් ඕනෑම ගොනුවකට) ඇති නිසා විය හැකිය:

Defaults requiretty

... එමඟින් sudoTTY අවශ්‍ය වේ. Red Hat පද්ධති (RHEL, Fedora ...) පෙරනිමි sudoersගොනුවේ TTY අවශ්‍ය බව දන්නා කරුණකි . එමඟින් සැබෑ ආරක්ෂක ප්‍රතිලාභයක් නොලැබෙන අතර ආරක්ෂිතව ඉවත් කළ හැකිය.

Red Hat ගැටළුව පිළිගෙන ඇති අතර එය අනාගත නිකුතුවලදී ඉවත් කරනු ඇත.

සේවාදායකයේ වින්‍යාසය වෙනස් කිරීම විකල්පයක් නොවේ නම්, එම වැරදි වින්‍යාසය සඳහා වැඩක් ලෙස, ඔබට දුරස්ථ පැත්තේ ව්‍යාජ පර්යන්තයක් ඇති කරන විකල්ප -tහෝ -ttවිකල්ප භාවිතා කළ හැකිය ssh, නමුත් එයට පැති ගණනාවක් ඇති බවට පරිස්සම් වන්න බලපෑම්.

-ttයනු අන්තර්ක්‍රියාකාරී භාවිතය සඳහා ය. එය rawදුරස්ථ පර්යන්තය සමඟ අන්තර් ක්‍රියා කරන පරිදි දේශීය පර්යන්තය ප්‍රකාරයට දමයි . එයින් අදහස් වන්නේ sshI / O පර්යන්තයක සිට / නොවේ නම්, එය අතුරු ආබාධ ඇති කරන බවයි. උදාහරණයක් වශයෙන්, සියලු ආදාන, නැවත විශේෂ පර්යන්තය චරිත ප්රතිරාවය කරනු ලැබේ ( ^?, ^C, ^U) විශේෂ සැකසුම් හේතුවන බවත්; ප්රතිදානය මත, LFs වෙත පරිවර්තනය වනු ඇත CRLFබලන්න ගේ ... ( මෙම පිළිතුර ඇයි මේ ද්විමය ගොනුව වෙනස් වන්නේ කෙසේද? වේ වැඩි විස්තර සඳහා.

බලපෑම අවම කිරීම සඳහා, ඔබට එය පහත පරිදි කළ හැකිය:

ssh -tt host 'stty raw -echo; sudo ...' < <(cat)

මෙම < <(cat)දේශීය පර්යන්තය (අවශ්ය නම් පමණක්) පිහිටුවීමට මග හරිනු ඇත rawප්රකාරය. stty raw -echoදුරස්ථ පර්යන්තයේ රේඛීය විනය පසුකර යන ලෙස සැකසීමට අපි භාවිතා කරමු (effectively ලදායී ලෙස එය ව්‍යාජ පර්යන්තයක් වෙනුවට භාවිතා කරන නළය මෙන් ක්‍රියා කරයි -tt, නමුත් එය අදාළ වන්නේ එම විධානය ක්‍රියාත්මක වීමෙන් පසුව පමණි, එබැවින් ඔබට අවශ්‍යය එය සිදු වන තුරු ආදානය සඳහා යමක් යැවීම ප්‍රමාද කිරීමට).

දුරස්ථ විධානයේ ප්‍රතිදානය පර්යන්තයකට යන බැවින්, එය තවමත් එහි බෆරයට (බොහෝ යෙදුම් සඳහා රේඛීය පදනම් වනු ඇත) සහ කලාප පළල කාර්යක්ෂමතාවයට බලපාන බව සලකන්න TCP_NODELAY. එසේම -tt, sshIPQoS 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'

((දෙකම සඳහා) දුරස්ථ පරිශීලකයාගේ පිවිසුම් කවචය බෝර්න් වැනි යැයි උපකල්පනය කරයි).


30

පෙරනිමියෙන්, SUDO TTY අවශ්‍ය වන පරිදි සකසා ඇත. එනම්, SUDO පිවිසුම් කවචයකින් ධාවනය කිරීමට අපේක්ෂා කෙරේ. -tඔබේ SSH ආයාචනයට ස්විචය එක් කිරීමෙන් ඔබට මෙම අවශ්‍යතාව පරාජය කළ හැකිය :

ssh -t someserver sudo somecommand

මෙම -tව්යාජ tty වෙත බලවේග වෙන්.

ඔබට මෙය ගෝලීයව සිදු කිරීමට අවශ්‍ය නම්, /etc/sudoersනියම කිරීමට වෙනස් කරන්න !requiretty. මෙය එක් පරිශීලකයෙකුට, කණ්ඩායමකට හෝ සියල්ල ඇතුළත් වන මට්ටමකින් කළ හැකිය.


5
නැත, එය පෙරනිමිය නොවේ. එය බව sudo පමණක් redhat බෙදා තියෙන්නේ requirettyප්රකෘති sudoers දී. එය නව නිකුතුවලදී සවි කෙරෙනු ඇත
ස්ටෙෆාන් චසෙලාස්

1
B ස්ටෙෆේන් චැසෙලාස් +1 එය බොහෝ දුරට ස්වදේශිකයන් වන Red Hat සහ එහි සහෝදර සහෝදරියන් බව මට දන්වා ඇති අතර තවත් ++ වර්තමාන දෝෂ වාර්තාව සඳහා මට හැකි නම්!
JRFerguson

18

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.
සැම්වින්

11

මම ඩොකර් සහ සෙන්ටෝස් 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 වෙතින් හමු විය


1
මෙම පිළිතුර ඩොකර් සහ සෙන්ටෝස් 7 භාවිතා කරමින් මට වඩාත් අර්ථවත් විය. තේරුම් ගැනීම පහසු මෙන්ම පිටපත් / පේස්ට් මිත්‍රශීලී විය!
DaShaun

1

සිත්ගන්නා විකල්පයක් නම් ඔබේ පරිශීලකයින් සහ සුඩෝ නීති කළමනාකරණය කිරීම සඳහා FreeIPA හෝ IdM ධාවනය කිරීමයි. එවිට ඔබට සුඩෝ රීති නිර්මාණය කර විකල්පය පැවරිය හැකිය

අවශ්‍යතාවය

රීතිය තුළ. එවිට විධානය අපේක්ෂිත පරිදි ක්‍රියාත්මක වේ. සියලුම සේවාදායකයන් සහ පරිශීලකයින් තනි වින්‍යාස සමූහයකින් කළමනාකරණය කිරීමේ ප්‍රතිලාභද ඔබට ඇත.


0

මටත් ඒ ප්‍රශ්නයම තිබුණා. මගේ නඩුවේදී, විසඳුම පේළි දෙකක් විය

myscript=$(cat ssh_test.sh)
ssh -t user@host "$myscript"

පැහැදිලි කිරීම:

  • ඔබට ක්‍රියාත්මක කිරීමට අවශ්‍ය විධාන (සුඩෝ විධාන ඇතුළුව) ස්ක්‍රිප්ටයක් තුළ තබන්න උදා: "ssh_test.sh".

  • මුළු පිටපතම "myscript" නමින් විචල්‍යයකට කියවන්න.

  • Ssh එක -t සමඟ ආයාචනා කර විධානය වෙනුවට විචල්‍යය සපයන්න.

මෙයට පෙර, මම stdin වෙතින් කියවීමේ සංයෝජන සහ හෙරොඩොක්ස් භාවිතා කරමින් ගැටළු වලට මුහුණ දුන්නා


-1

ගූග්ලිං අතර මට මෙම ප්‍රශ්නය හමු වූ අතර මට සම්පූර්ණයෙන්ම වෙනස් හේතුවක් නිසා මෙම දෝෂය ඇතිවිය.

මගේ විසඳුම වූයේ sudoමව් ෂෙල් ස්ක්‍රිප්ට් එක දැනටමත් කැඳවා ඇති විට මගේ මව් ෂෙල් ස්ක්‍රිප්ටයේ සිට පහළට ෂෙල් ස්ක්‍රිප්ට් ඇමතීම නතර sudoකිරීමයි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.