SSH සම්බන්ධතාවයේ “ලිවීම අසාර්ථකයි: කැඩුණු නළය” වළක්වා ගන්නේ කෙසේද?


313

Write Failed: broken pipeදෝෂ වළක්වා ගැනීම සඳහා සේවාදායකයා සහ සේවාදායකය යන දෙකෙහිම SSH වින්‍යාස කිරීමට මට කුමක් කළ හැකිද? ඔබේ සේවාදායක පරිගණකය නිදාගෙන නැවත ආරම්භ කරන්නේ නම් එය බොහෝ විට සිදුවේ.


8
ඇත්තටම මුකුත් නෑ. සැසිවාරයට බාධා ඇති වූ අතර සැසියේ ආරක්ෂාව අඩාල විය. ඔබ නින්දට කොම්පෝට් එක නොතැබුවහොත් සේවාදායකයාට හෘද ස්පන්දනය සේවාදායකයාට වෙඩි තබා ගැනීමට ඔබට කාලය ඉතිරි කර ගත හැකිය, නමුත් පද්ධතිය නින්දට යන්නේ නම් කළ හැකි කිසිවක් නැත.
darkdragn

3
මෙම අවස්ථාවේ දී මම නැවත ආරම්භ වූ කැඩී ssh සම්බන්ධතාවයක් (පිටවීම කේතය මත බොහෝ විට පදනම්) ඉඩ හා භාවිතා යලි ස්ථාපිත කරනු ඇති බව යමක් සොයනවා screen?
සෝරින්

4
ඔබ වැරදියි: මට එකම සේවාදායකයට සම්බන්ධ වන ඩෙස්ක්ටොප් සේවාදායක යන්ත්‍ර දෙකක් තිබේ. එකක් උබුන්ටු 12.10, ක්වොන්ටල්, ඔහුගේ SSH සේවාදායකයා හොඳින් ක්‍රියා කරන අතර පැය ගණනක් සම්බන්ධතාවය තබා ගනී. අනෙක උබුන්ටු 14.10, මනෝරාජික ය, අනෙක් පැත්ත පසෙකට දමා නැවුම් ස්ථාපනයකින්; මිනිත්තු දෙකකට පසු, එය මෙම පණිවිඩය සමඟ අවහිර කරයි. යන්ත්‍රයේ ඉතිරි ජාල ක්‍රියාකාරිත්වයට බාධා නොමැත. එබැවින් නැත, එය ජාල ගැටළුවක් හෝ සේවාදායක ගැටළුවක් නොවේ, නමුත් නිශ්චිත අඳුරු SSH සේවාලාභී මෘදුකාංග ගැටළුවක් විසඳිය හැකි අතර එය "අඳුරු ඩ්‍රැගන්" කීමට නිර්භීත වන දෙයට ප්‍රතිවිරුද්ධව "කිසිවක් කළ නොහැක".
ඩේවිඩ් එල්

2
ඇත්ත වශයෙන්ම, මා කී පරිදි: ark ඩාර්ක්ඩ්‍රැගන් එඩිතර වූවාක් මෙන්, “කිසිවක් කළ නොහැක” යැයි පවසන විට මිනිසුන් ඕනෑවට වඩා කතා කරති. මම අරම් කොචරියන්ගේ පිළිතුර කියවූ අතර, මම එය අදාළ කරගත්තේ: මිනිත්තු 20 කට පෙර ... මගේ පැරණි ක්වොන්ටල් උබුන්ටු 12.10 හි, මම එම උපදෙස් මීට වසර දෙකකට පෙර එම ගොනුවේ [මම පරීක්ෂා කර බැලුවෙමි], එම ගොනුවේ යෙදී ඇති බව මට වැටහුණි. එහි ස්ථායිතාවයට හේතුව. මම එය මෙහි සිදු කළ අතර, මෙම අවසාන මිනිත්තු 20 තුළ, එතැන් සිට සම්බන්ධතාවය ස්ථාවර වී ඇත. එබැවින් කරුණාකර, ජනතාව: “කිසිවක් කළ නොහැකි” යැයි සිතීමට නිර්භීත වන විට ඔබම වැළකී සිටින්න, එම පණිවිඩය වෙනත් පුද්ගලයින්ට ලබා දීමට උත්සාහ කිරීමේදී ඊටත් වඩා වළකින්න.
ඩේවිඩ් එල්

11
Av ඩේවිඩ්ල් ඔබ කතා කිරීමට පෙර ප්‍රශ්න වඩා හොඳින් කියවිය යුතුය. ඔබේ ගැටළුව පරිගණකය නින්දට දැමීම ගැන පැහැදිලිව සඳහන් කරන OP වලට සමාන නොවේ. කුමන ආකාරයෙන් පිළිතුරු ලිපිනය ("මෝෂ්") පමණක් වන අතර එය ප්‍රශ්නයට වසර 2 කට පසුව පළ කරන ලදි. කෙසේ වෙතත් අනෙක් පිළිතුරු ඊළඟ හොඳම දේ කරයි, එය ඔබ වැනි වඩාත් පහසුවෙන් විසඳිය හැකි අවස්ථාවන්ට විසඳුම් යෝජනා කරයි. සන්සුන් වන්න, එතරම් ආතතියට පත් නොවන්න,
රැන්ටිං කිරීම

Answers:


291

මම මෙය /etc/ssh/ssh_configලිනක්ස් සහ මැක් සඳහා උත්සාහ කර ඇත :

Host *
ServerAliveInterval 120

තත්පර කිහිපයකින් එය සේවාදායකයට රහසිගත පණිවිඩයක් යැවිය යුත්තේ මෙයයි. එය ක්‍රියාත්මක නොවන්නේ නම්, ඔබ වැඩ කරන අතරතුර සෑම මිනිත්තු දෙකකට වරක් ඇතුල් කිරීමට ඔබ වඳුරෙකු පුහුණු කරන්න.

එක්කෝ ඔබ නියම කළ හැකි ServerAliveIntervalතුළ /etc/ssh/ssh_configග්රාහකය හෝ ClientAliveIntervalදී /etc/ssh/sshd_configසේවාදායකය යන්ත්රය. ඔබ තවමත් දෝෂය ලබා ගන්නේ නම් පරතරය අඩු කිරීමට උත්සාහ කරන්න.

තනි පරිශීලකයෙකු සඳහා වින්‍යාසය ~/.ssh/configසේවාදායකයේ සහ සේවාදායකයාගේ පැත්තෙන් ගොනුවේ සැකසිය හැකිය . ගොනුවට නිවැරදි අවසර ඇති බවට වග බලා ගන්න chmod 644 ~/.ssh/config.


4
මම මැක්හි නොසිටි නමුත් උබුන්ටු 12.04 සහ මෙම මෙහෙයුම් පද්ධතිය සඳහා වන ගොනුව ~ / .ssh / config ලෙස පෙනේ.
H2ONaCl

5
OS X 10.8.4 දෝෂයක් ලබා දෙයිBad configuration option: ClientAliveInterval
ohho

3
Bad configuration optionOSX 10.8.4 හි මට එම දෝෂයම ඇත.
නික් හයිනර්

12
සාමාන්‍යයෙන්, ඔබ මෙම විධානයන් දෙක පද්ධතියේ විවිධ කොටස් වලට දමයි. OSX ග්‍රාහක පැත්තේ ServerAliveInterval පමණි ... සහ sshd වින්‍යාස ගොනුවේ ClientAliveInterval පමණි ...
ftrotter

3
[Enter] "" ඇයි ඔබ ටයිප් කරන්නේ නැහැ "ඉහල: මගේ වඳුරු මට කතා කොට,
ඔගස්ටෝ

93

SSH සැසි බොහෝ හා නොවැලැක්විය හැකි හේතු නිසා කැඩී යා හැක.

මෙය නිසා ඇතිවන ගැටළු අවම කිරීම සඳහා භාවිතා කළ හැකි ප්‍රයෝජනවත් උපයෝගීතාවයක් ලෙස හැඳින්වේ screen. තිරය ​​ප්‍රබල උපයෝගීතාවයක් වන අතර එය ssh සැසියෙන් ස්වාධීනව ජීවත්වන බහු පර්යන්ත පාලනය කිරීමට ඔබට ඉඩ සලසයි. උදාහරණයක් ලෙස, ඔබ screenssh සැසියක ධාවනය කරන්නේ නම් ඔබට නව පර්යන්තයක් විවෘතව පෙනෙනු ඇති අතර ඔබට එය ක්‍රියාත්මක කිරීමට භාවිතා කළ හැකිය. ඔබගේ ssh සැසිය ක්‍රියාවලියේදී මිය යන බව කියමු. screen -dඑවිට ධාවනය කිරීමෙන් screen -rඅවසාන සැසිය නැවත විවෘත වන අතර ඔබට එතැන් සිට ඉදිරියට යාමට හැකි වේ. සමහර ලියකියවිලි භාවිතා කිරීමට පෙර එය කියවීමට වග බලා ගන්න .


5
මෙය බොහෝ විට හොඳම පිළිතුර විය හැකිය, එය ඉහළින් ඡන්දය නොදෙන්නේ මන්දැයි මට විශ්වාස නැත. SSH සම්බන්ධතාවයක් පවත්වා ගැනීම පිළිබඳව ඔබ සැබවින්ම සැලකිලිමත් වන විශේෂ අවස්ථාවෙහිදී අනෙක් "නිවැරදි කිරීම්" උපකාරී වේ, නමුත් බොහෝ භාවිත අවස්ථා වලදී මම සිතන්නේ සැබෑ සැලකිල්ල වන්නේ ඕනෑම සේවාදායක / සේවාදායක සම්බන්ධතා ගැටළු නොසලකා අපේක්ෂිත ක්‍රියාවලීන් අඛණ්ඩව ක්‍රියාත්මක වීමයි. .
පෝල් මැක්මර්ඩි

17
තිරයට විකල්පයක් ලෙස මම Tmux එකතු කරමි . තිරයට වඩා එය විවිධාකාර හා ස්ථාවර බව මට පෙනේ.
fridaymeetssunday

2
අනාගත යොමු කිරීම සඳහා මෙය මෙහි තබන්න - screen -d -rඔබේ අවසාන සැසිය නැවත ලබා ගැනීමට ඔබට පහසුවෙන් ධාවනය කළ හැකිය .
doplumi

3
නැතහොත් සරලව screen -dr. නැතහොත් screen -xඔබ කිරීමට සැලසුම් කරන දේ මත පදනම්ව. කාරණය වන්නේ, එම ස්විචයන් කරන්නේ කුමක්ද යන්න යමෙකු දැනගත යුතු අතර එමඟින් කෙනෙකුට සුදුසු ඒවා භාවිතා කළ හැකි අතර අන්තර්ජාල පුද්ගලයින්ගේ යෝජනා අන්ධ ලෙස අනුගමනය නොකරන්න. ලස්සන සංයුක්ත සාරාංශයක් මෙහි ඇත: ss64.com/bash/screen.html
flith

1
මෙය ගැටලුවට පිළිතුරක් නොවේ
user3728501

53

සේවාලාභී වින්‍යාසය

ගොනුව සෑදීමට උත්සාහ කරන්න:

~/.ssh/config

අන්තර්ගතය එක් කරන්න:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

දැන් ඔබේ සේවාදායකයට ගොස් ඔබේ ගැටලුව විසඳී ඇත්දැයි බලන්න. ClientAliveInterval විකල්පය ප්‍රයෝජනවත් වන්නේ ssh සේවාදායකය (aka sshd) වින්‍යාස කිරීමේදී පමණි, එය ssh ග්‍රාහක පැත්තේ කිසිවක් වෙනස් නොකරයි, එබැවින් ඉහත වින්‍යාස ගොනුවේ එය භාවිතා නොකරන්න.

පෙර තත්පර 30 තුළ (ඉහත දක්වා ඇති පරිදි) පැකට් කිසිවක් නොලැබුනේ නම් මෙය සේවාදායකයට හෙලෝ-යූ-ඔබ-සං signal ාවක් යවනු ඇත. කෙසේ වෙතත්, අඛණ්ඩව හෙලෝ-ඔබ-ඔබ සිටින සං sign ා ගණන ServerAliveCountMax වෙත ළඟා වුවහොත් ssh සේවාදායකයෙන් විසන්ධි වේ. මෙම අගය පෙරනිමි 3 ක් වේ (එබැවින් සේවාදායක ක්‍රියාකාරකම් නොමැතිව තත්පර 3 * 30 = 90), එය ඔබගේ අවශ්‍යතාවයට ගැලපෙන පරිදි වැඩි කරන්න. .Sh / config ගොනුවට තවත් වින්‍යාස විකල්ප ඇත, ඔබට කියවිය හැකිය:

SSH වින්‍යාස ගොනුවක් භාවිතා කිරීම

වෙනත් විකල්ප පිළිබඳ වැඩි විස්තර සඳහා. මෙම උදාහරණය සම්බන්ධ වන ඔබ සම්බන්ධ කරන සෑම සේවාදායකයකටම මෙය යෙදීමට ඔබට අවශ්‍ය නොවනු ඇත. හෝ පේළිය ආදේශ කිරීමෙන් එය විශේෂිත සේවාදායකයකට පමණක් සීමා Host *කරන්න Host <IP>(IP ලිපිනයකින් ආදේශ කරන්න, ssh_config man පිටුව බලන්න).

සේවාදායක වින්‍යාසය

ඒ හා සමානව ඔබේ සේවාදායකයින් සමඟ මෘදු ලෙස කටයුතු කරන ලෙස සේවාදායකයාට පැවසිය හැකිය. වින්‍යාස ගොනුව /etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5

පිරික්සුම් වලට ප්‍රතිචාර නොදක්වා සැකසීමෙන් හෝ වෙනස් ClientAliveIntervalකිරීමෙන් සහ උපරිම ssh සේවාදායකයාගේ අක්‍රියතාව සැකසීමෙන් ඔබට එය අක්‍රිය කළ හැකිය . TCPKeepAlive හරහා මෙම සැකසීම්වල එක් වාසියක් නම් සංකේතාත්මක නාලිකා හරහා සං als ා යැවීමයි, එබැවින් එය නරක් වීමට ඇති ඉඩකඩ අඩුය.0ClientAliveIntervalClientAliveCountMax


එය ක්‍රියා නොකරයි. මම නැවතත් එම දෝෂයට මුහුණ දෙමි.
user997704

3
විධාන රේඛාවෙන් කෙළින්ම උත්සාහ කර පහළට යන්න: ssh -o ServerAliveInterval = 5 user @ host
Matt

ඒකත් උත්සාහ කළා .. වැඩ කරන්නේ නැහැ. මගේ පද්ධතිය සමඟ සිදුවන්නේ කුමක්දැයි මම නොදනිමි
user997704

2
එය ClientAliveCountMax, NOT ClientAliveMaxCount
David G

AvDavidG කරුණාකර ඔබේ නිවැරදි කිරීම් සමඟ පිළිතුර සංස්කරණය කරන්න.
CivMeierFan

27

මම දුරස්ථව උබුන්ටු සේවාදායකයක් පැහැදිලි සිට නිරවද්‍යතාවයට යාවත්කාලීන කර ඇති අතර "ලිවීම අසාර්ථකයි. කැඩුණු නළය" යන පණිවිඩය සමඟ උත්ශ්‍රේණිගත කිරීමේ මධ්‍යයේ ඇති ssh සම්බන්ධතාවය නැති විය. ClientAliveInterval සහ ServerAliveInterval කිසිවක් කළේ නැත. විසඳුම වන්නේ සේවාදායක ssh හි TCPKeepAlive විකල්ප සක්‍රිය කිරීමයි:

TCPKeepAlive yes

තුල

/etc/ssh/ssh_config

මෙය උපකාරී වේ යැයි සිතමි


23

සේවාදායකයා සඳහා, ඔබගේ ~/.ssh/config(හෝ /etc/ssh/ssh_config) ගොනුව පහත පරිදි සංස්කරණය කරන්න :

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive - පද්ධතිය TCP රඳවා තබා ගැනීමේ පණිවිඩ අනෙක් පැත්තට යැවිය යුතුද යන්න නියම කරයි. ඒවා යවනු ලැබුවහොත්, සම්බන්ධතාවයේ මරණය හෝ එක් යන්ත්‍රයක බිඳ වැටීම නිසි ලෙස හඳුනාගත හැකිය. කෙසේ වෙතත්, මෙයින් අදහස් කරන්නේ මාර්ගය තාවකාලිකව පහළට ගියහොත් සම්බන්ධතා මිය යන අතර සමහර අය එය කරදරයක් ලෙස සලකන බවයි (පෙරනිමිය 'ඔව්').

ServerAliveInterval - තත්පර කිහිපයකින් කල් ඉකුත් වූ කාල පරතරයක් සකසයි, ඉන්පසු සේවාදායකයෙන් දත්ත කිසිවක් නොලැබුනේ නම්, ssh (1) සේවාදායකයාගෙන් ප්‍රතිචාරයක් ඉල්ලා සංකේතාත්මක නාලිකාව හරහා පණිවිඩයක් යවනු ඇත. පෙරනිමිය 0 වන අතර එයින් පෙන්නුම් කරන්නේ මෙම පණිවිඩ සේවාදායකයට නොයවන බවයි.


සේවාදායකය සඳහා, ඔබේ /etc/ssh/sshd_configමෙසේ සංස්කරණය කරන්න :

ClientAliveInterval 600
ClientAliveCountMax 0

ඔබට ssh සේවාදායකයාට විනාඩි 10 කට පසු (තත්පර 600) ස්වයංක්‍රීයව පිටවීමට (කල් ඉකුත් වීමට) අවශ්‍ය නම්.

ClientAliveCountMax - ssh සේවාදායකයාගෙන් කිසිදු ප්‍රතිචාරයක් ලබා නොගෙන ssh සේවාදායකයා විසින් එවන ලද මුළු පිරික්සුම් පණිවිඩය මෙයින් පෙන්නුම් කෙරේ. පෙරනිමිය 3 වේ.

ClientAliveInterval - මෙය තත්පර කිහිපයකින් කල් ඉකුත්වීම පෙන්නුම් කරයි. තත්පර x සංඛ්‍යාවෙන් පසුව, ssh සේවාදායකයා ප්‍රතිචාරය ඉල්ලා සේවාදායකයාට පණිවිඩයක් යවනු ඇත. බිහිරි වීම 0 (සේවාදායකයා පරීක්ෂා කිරීමට සේවාදායකයාට පණිවිඩයක් යවන්නේ නැත.).


මෙයද බලන්න: විකල්පයන් ServerAliveIntervalසහ ClientAliveIntervalsshd_config හි හරියටම කරන්නේ කුමක්ද?


සේවාදායකයේ පෙරනිමියට වඩා ඉහළින් සර්වර් ඇලයිව්කවුන්ට්මැක්ස් සැකසීමද මන්දගාමී සම්බන්ධතා සඳහා සම්බන්ධතාවය සජීවීව තබා ගැනීමට උපකාරී වේ.
jonnyjandles

18

මම මෝෂ්ට ආදරෙයි. මම නිතරම සේවාදායකයක් වෙතට ගොස් මගේ ලැප්ටොප් එක වසා කැෆේ එකකට ගොස් එය විවෘත කර කිසිවක් වෙනස් නොවන ලෙස ඉදිරියට ගෙන යන්නෙමි.

මෝෂ් (ජංගම කවචය)

දුරස්ථ පර්යන්ත යෙදුම රෝමිං වලට ඉඩ සලසයි , වරින් වර සම්බන්ධතාවයට සහය දක්වයි , සහ බුද්ධිමත් දේශීය දෝංකාරය සහ පරිශීලක යතුරු එබීම් රේඛා සංස්කරණය කරයි.

මෝෂ් යනු එස්එස්එච් වෙනුවට ආදේශ කිරීමකි. එය වඩාත් ශක්තිමත් සහ ප්‍රතිචාරාත්මක වේ, විශේෂයෙන් Wi-Fi, සෙලියුලර් සහ දිගු දුර සම්බන්ධතා හරහා.

මෝෂ් යනු නිදහස් මෘදුකාංගයකි, එය ග්නූ / ලිනක්ස්, ෆ්‍රීබීඑස්ඩී, සොලාරිස්, මැක් ඕඑස් එක්ස් සහ ඇන්ඩ්‍රොයිඩ් සඳහා ලබා ගත හැකිය.


6

මට නම්, මම Write failed: Broken pipeක්‍රියාශීලීව ටයිප් කරන විට හෝ ෂෙල් විමසුමේදී පවා ලැබෙමින් සිටියෙමි. මට ටික වේලාවක් දේශීයව අන්තර්ජාලය පිරික්සීමට නොහැකි විය. (මම දුරස්ථව ටර්මිනලය භාවිතා කරමින් උබුන්ටු වෙත සම්බන්ධ වෙමින් සිටියෙමි.)

මගේ ජාලයේ අනෙක් අය නෙට්ෆ්ලික්ස් සහ වෙනත් ස්ථාන වලින් වීඩියෝ විශාල ප්‍රමාණයක් ප්‍රවාහනය කරති. මට එය ඔප්පු කළ නොහැක, නමුත් එහි ISP හෝ රවුටරයේ ගැටලුවක් යැයි මම සැක කරමි. උදාහරණයක් ලෙස, වෙරිසොන් සහ නෙට්ෆ්ලික්ස් ඔවුන්ගේ ගනුදෙනුකරුවන්ගේ ජාල ගැටලු සඳහා එකිනෙකාට ඇඟිල්ල දිගු කරති.

ඔබට ඩයල්-අප් සම්බන්ධතාවයක් තිබේ නම් සහ එකවර එස්එස්එච් හෝ ටෙල්නෙට් සම්බන්ධතාවයක් සහිත වීඩියෝ හෝ සංගීතය ප්‍රවාහනය කරන්නේ නම්, යම් අවස්ථාවක දී ඔබට බිඳුණු නල පණිවිඩයක් ලැබෙනු ඇත. මගේ අයිඑස්පී බ්‍රෝඩ්බෑන්ඩ් පැකේජය යාවත්කාලීන කිරීමෙන් මගේ බිඳුණු සම්බන්ධතාවය අඩු වාර ගණනක් ඇති බව පෙනේ.



3

SSH වින්‍යාස සේවාදායකයා හෝ සේවාදායකයා නොසලකා දුරස්ථ සේවාදායකයේ කිසි විටෙක අසමත් වන බවක් මට නොපෙනේ.

#!/bin/bash
while true; do date; sleep 10; done;

එය කිසියම් dummy.sh ගොනුවකට සුරකින්න, ඔබ කවුළුව අවම කිරීමට හෝ එයින් ඉවතට යාමට පෙර එය ඉක්මනින් ධාවනය කරන්න. එය සේවාදායකයේ වත්මන් කාල මුද්දරය මුද්‍රණය කරමින් සිටින අතර වෙනත් හේතුවක් නිසා සම්බන්ධතාවය අතහැර නොදමන තාක් කල් ඔබේ සම්බන්ධතාවය සජීවීව තබා ගනී. ඔබ නැවත එම පර්යන්තයට ගිය විට, CTRL + C යතුර ඔබා වැඩ කරන්න.


10
නැතහොත් topධාවනයෙන් ඉවත් වන්න
ඊබන් ගීර්

හෝ වලිගය ධාවනය කරන්න -f / dev / null
මුකුන්දන්

1

ඔබ ssh ඉල්ලන සෑම අවස්ථාවකම ඔබට මෙම ආරුක්කු එකතු කළ හැකිය: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

ඔබ මෙය කරන්නේ නම් / etc / ssh / * වින්‍යාස ගොනු සංස්කරණය කිරීමට අවශ්‍ය නැත.

මෙය පහසු කිරීම සඳහා ඔබට bash අන්වර්ථයක් හෝ ශ්‍රිතයක් හෝ ස්ක්‍රිප්ට් එකක් සෑදිය හැකිය.

උදා. pty සැකසීමට සහ විමසීම් වළක්වා ගැනීමට do_ssh_pty ස්ක්‍රිප්ට් තුළ භාවිතා කරයි.

do_ssh() {
    ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

do_ssh_pty() {
    ssh -tt -o "BatchMode=yes" -o "StrictHostKeyChecking=no" -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

දැන් do_ssh user@hostභාවිතා කළ හැකිය, නැතහොත් do_ssh user@host <args> <command>මුරකරුවන් සක්‍රීය වනු ඇත.

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.