[cdwdoc-2023-001] ALTLãªãŒããŒãããŒã«ã€ããŠ
ãã®èšäºã§ã¯ãçè ããA L T L ãªãŒããŒãããŒãïŒALTL overflowïŒãšåŒãã§ããæŠå¿µã«ã€ããŠè§£èª¬ããã
ãALTLãªãŒããŒãããŒããšã¯ãããã°ã©ã ãæ··ä¹±ãããææ³ã®äžã€ã§ããã
ãªãããã®èšäºã¯ããã°ã©ãã³ã°åå¿è ãèªãããšã¯æ³å®ããŠããªãã
ã
âããâããâããâããâããâ
â»ãã®èšäºã¯ãCC BY 4.0ïŒè¡šç€º 4.0 åœéïŒé©çšã§ãã
This article is licensed under CC BY 4.0.
https://creativecommons.org/licenses/by/4.0/deed.ja
âããâããâããâããâããâ
ãŸãã¯åºé¡
ã
ãŸãã¯ãåºé¡ã
ããŒãã³ãã§æ»ç¥ããããšãã人ã®ããã«ãæåã«ãŸãåé¡ãæç€ºããããšã«ããããã®èšäºã®äžã§ãåé ã®åºé¡ããšããã°ããã®ã»ã¯ã·ã§ã³ã®äžã§ä»ããæç€ºããåé¡ã®ããšã§ããã
æåã«æç€ºã¯ããŠãããã®ã®ãåé¡ãé£ã°ããŠæ¬¡ã®ã»ã¯ã·ã§ã³ãæ ¹æ¬åçã«ã€ããŠãã«é²ãã§ãå ã«è§£èª¬ã®ã»ãããã£ããèªãã§ããææŠããšãã圢ã§ãããŸããªãããããã¯åã«ã¹ã«ãŒããŠå ã«è§£èª¬ã®ã»ãã«é²ãã§ããã£ãŠãããŸããªãã
ã¡ãªã¿ã«ãã®èšäºã®è§£èª¬éšåã«ã€ããŠã¯ãã·ã§ã«ïŒBourneã·ã§ã«ãããã¯POSIXã·ã§ã«ïŒã®è©³çްãªä»æ§ãå¿ããŠããŸã£ããšãã人ã«ãããçšåºŠé æ ®ã¯ããã€ããã§ããã
ããããæç€ºããåºé¡ã¯ãåé¡ãšããŠã¯ã·ã³ãã«ã§ããã
ãŠãŒã¶ãŒã®æ£ãããã¹ã¯ãŒããç¥ãããšãªããæ£åœãªãŠãŒã¶ãŒãšããŠèª€ã£ãŠèªèãããããã«ããã°ã©ã ãæ··ä¹±ãããŠã¿ãããšãããã®ã§ããã
ãã§ã«Unixã®ãŠãŒã¶ãŒã©ã³ãã®ç°å¢ããããªããç°å¢æ§ç¯ã®æéãªã©ã¯äžåãªããã·ã§ã«ã¹ã¯ãªãã2ã€ãšããã¹ããã¡ã€ã«1ã€ãåããã£ã¬ã¯ããªã«çœ®ãã ãã§ããã
ãã ããsha256sum ã³ãã³ããå©çšå¯èœã§ãããããããç¡ããã° openssl ã³ãã³ããå©çšå¯èœã§ããããšãåæã§ããããŸããããããã®æå®å¯èœãªãªãã·ã§ã³ãæåŸ ãããåºå圢åŒã¯ä»¥äžã®ãããªãã®ã§ããããšãåæãšããŠããã
$ type sha256sum
sha256sum is /usr/bin/sha256sum
$ printf aaa | sha256sum
9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0 -
$ type openssl
openssl is /usr/bin/openssl
$ printf aaa | openssl sha256
SHA256(stdin)= 9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0ãªããæç€ºããã³ãŒããçè ã®æå³ããéãã«æ¯ãèãããšã確èªããç°å¢ãããã¯ã€ãŸãããããã¡ãããšè§£ããåé¡ããšããŠæç«ããŠããããšãçè èªèº«ãå®éã«åäœãããŠç¢ºèªããç°å¢ã¯ã以äžã®OSã§ããã
Lubuntu 22.04.1
Debian 11.6
Knoppix 5.1.1ïŒKNOPPIX_V5.1.1CD-2007-01-04-EN.isoïŒ
Knoppix 7.2.0ïŒKNOPPIX_V7.2.0CD-2013-06-16-EN.isoïŒ
Knoppix 9.1ïŒKNOPPIX_V9.1CD-2021-01-25-EN.isoïŒ
Kali Linux 2022.4ïŒkali-linux-2022.4-vmware-amd64.7zïŒ
Fedora 37 Workstation
Slackware 15.0
Tiny Core Linux 13.1ã®CorePlusçïŒCorePlus-13.1.isoïŒ
Alpine Linux 3.17.1 Standard EditionïŒglibcã§ã¯ãªãmusl libcïŒ
FreeBSD 13.1-RELEASE
OpenBSD 7.2
Oracle Solaris 11.4
OpenIndiana 2022.10ïŒOpenSolarisåŸç¶ïŒ
ãããããããã³ãŒãã®äžéšãä¿®æ£ãããšmacOSã§ãåããããããªããããã«ã€ããŠã¯ãã®ã»ã¯ã·ã§ã³ã®çµç€ã§è¿°ã¹ãã
ãŸããã«ãŒãã«åæ§ç¯ãå«ããŠãããããšã·ã¹ãã ã®æ§æã倿ŽããŠããŸã£ãŠããå Žåã«ã¯ãå®ã¯è§£ããªãããšããç°å¢ã«ãªã£ãŠããŸã£ãŠããå¯èœæ§ãããã
ããããåé¡ã®äœæè ãç°å¢ãæç¢ºã«ãæå®ãããã®ã¯ãã¯ãã©ã€ãèµ·åã®isoãããã ãããšããããšã§ãKnoppix 9.1ïŒ2021幎1æãªãªãŒã¹ïŒã®CDçã®è±èªçã®isoãVirtualBoxãVMware Workstation Playerã§èµ·åãããæïŒãããããå¯èœãªãããŒããŠã§ã¢æ§æã¯HDDãªãã§EFIã¯ç¡å¹ïŒããããã®åé¡ã®æ£åŒãªç°å¢ãªã®ã ããšããããšã«ããŠããããããããªãã
$ openssl md5 KNOPPIX_V9.1CD-2021-01-25-EN.iso
MD5(KNOPPIX_V9.1CD-2021-01-25-EN.iso)= 5f582a85d0d79c5d6c751b8b80ad8401ãªããKnoppixèµ·ååŸã®ã¿ãŒããã«ã«ã€ããŠã¯ãç»é¢å·Šäžã®ã¡ãã¥ãŒãã [System Tools] -> [Terminator] ã§èµ·åã§ãããç»é¢å·Šäžã®Chromiumã®ã¢ã€ã³ã³ã®2ã€å³ã«ããèµ€ã£ãœãã¢ã€ã³ã³ãããã®Terminatorã®ã·ã§ãŒãã«ããã§ããã
2017幎ãããããDockerãæé¢šãå·»ãèµ·ãããŠããããKnoppixã®ãããªãã®ã«ã€ããŠã¯å€ãããŒãžã§ã³ãå«ããŠisoã€ã¡ãŒãžãã¡ã€ã«ãä»åŸãé åžããç¶ããŠã»ãããšå人çã«ã¯é¡ã£ãŠãããOSã®ããŒãã®ããæ¹ãå«ããç°å¢ãã®ãã®ããŸãããšå·åä¿åãããŠãããšããã®ã¯åãããšãªã®ã ã
ããã¯ãšããããåºé¡ã®ããã°ã©ã ã«ã€ããŠã
ãŸãã¯1ã€ç®ã®ãã¡ã€ã«ãããè§£ã人ã¯ãããã¿ãŒããã«ããçŽæ¥å®è¡ããã
ãã¡ã€ã«å㯠cdwdoc-2023-001_challenge.sh ã§ããã
#!/bin/sh
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
LANG=C ; export LANG
LC_ALL=C ; export LC_ALL
username="$1"
password="$2"
valid_password_hash=$(cat cdwdoc-2023-001_challenge_passwd.txt \
| grep "^${username}:" \
| head -1 \
| awk -F':' '{print $2}')
user_is_valid=1
if ./cdwdoc-2023-001_challenge2.sh --user-input="$password" --valid-hash="$valid_password_hash" ; then
user_is_valid=0
fi
if [ "x$user_is_valid" = "x1" ]; then
echo 'you are a valid user! [ user name : "'"$username"'" ]' >&2
exit 0
else
echo 'error: you are not a valid user' >&2
exit 1
fiGitLab.com äžã«ã眮ããŠããïŒ https://gitlab.com/-/snippets/2494925 ïŒã
ãªã GitLab.com äžã®GitLab Snippetsã®ããŒãžã«ç§»åããŠããŸããšããã³ãã«ãªãããšãã³ã¡ã³ããªã©ã«æžãããŠããå¯èœæ§ãããã®ã§æ³šæãããŒãžã®äžã®ã»ãã«ããã³ã¡ã³ãæ¬ãèŠçã«å ¥ããªãããã«ããã°ç¹ã«åé¡ãªãããŸããçè ã®ä»ã®ã¹ããããã«ãã³ããæžãããŠããå Žåãããã
ãããŠã2ã€ç®ã®ãã¡ã€ã«ãè§£ã人ã¯ãããçŽæ¥å®è¡ããŠã¯ãªããªãããã®ãã¡ã€ã«ã¯ cdwdoc-2023-001_challenge.sh ããåŒã°ããã
cdwdoc-2023-001_challenge2.sh ( https://gitlab.com/-/snippets/2494925 )
#!/bin/sh
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
LANG=C ; export LANG
LC_ALL=C ; export LC_ALL
get_hash() {
if type sha256sum > /dev/null; then
sha256sum | awk '{print $1}'
elif type openssl > /dev/null; then
openssl sha256 | awk '{print $2}'
fi
}
valid_hash=` printf '%s\n' "$2" | sed 's/^--valid-hash=//' `
user_input_hash=` printf '%s\n' "$1" | sed 's/^--user-input=//' | tr -d '\n' | get_hash`
if [ "x$user_input_hash" = "x$valid_hash" ]; then
exit 1
fi
exit 0以äžã®2ã€ããä»åãã®èšäºã®ããã«ãæå³çã«è匱ã«ãªãããã«çè ãæžããã¹ã¯ãªããã§ããã
ãããŠæåŸã3ã€ç®ã®ãã¡ã€ã«ãããã¯ã¹ã¯ãªããã§ã¯ãªãããŒã¿ã§ãããå 容ã¯3è¡ã ãã§ããŠãŒã¶ãŒåãšããã·ã¥å€ããããã®ã®ãªã¹ãã§ãããèŠããã«ããã ã®ãŠãŒã¶ãŒæ å ±ã®ããŒã¿ããŒã¹ã ã
cdwdoc-2023-001_challenge_passwd.txt
( https://gitlab.com/-/snippets/2494925 )
user1:9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0
user2:28ac62f4e66742848b75319b3d861bc67657abb31cc2077758dcf2669dbf3c47
user3:636c65656d792064657375207761796f636c65656d792064657375207761796fãµãã£ãã¯ã¹ïŒæ¡åŒµåïŒã .sh ã®ãã¡ã€ã«ã2ã€ãš .txt ã®ãã¡ã€ã«ã1ã€ãããã3ã€ãåããã£ã¬ã¯ããªã«çœ®ãã.sh ã®ãã¡ã€ã«ã«ã¯å®è¡æš©éãä»äžããŠããã
$ ls -l cdwdoc-2023-001_challenge*
-rwx---r-x 1 kali kali 633 Feb 6 02:52 cdwdoc-2023-001_challenge.sh
-rwx---r-x 1 kali kali 533 Feb 6 02:50 cdwdoc-2023-001_challenge2.sh
-rw----r-- 1 kali kali 213 Jan 22 16:49 cdwdoc-2023-001_challenge_passwd.txtãããŠä»¥äžã®ããã«ã㊠cdwdoc-2023-001_challenge.sh ãå®è¡ãããyou are a valid user!ããšåºãã°æºåã®ç¬¬1段éã¯å®äºã§ããã
$ ./cdwdoc-2023-001_challenge.sh user1 aaa
you are a valid user! [ user name : "user1" ]1ã€ç®ã®åŒæ°ããŠãŒã¶ãŒåã§ã2ã€ç®ã®åŒæ°ã¯ãã¹ã¯ãŒãã§ããã
èªèšŒãæåãããšå€æãããã°ããyou are a valid user!ãã衚瀺ãããã
2ã€ç®ã®åŒæ°ãã€ãŸããã¹ã¯ãŒãããaaaaãã«å€æŽããŠå®è¡ããŠã¿ããšãä»åºŠã¯ãyou are not a valid userããšåºãã¯ãã§ããã
$ ./cdwdoc-2023-001_challenge.sh user1 aaaa
error: you are not a valid useræ£ãããã¹ã¯ãŒããå ¥åããã°ãyou are a valid user!ããåºãŠãééã£ããã¹ã¯ãŒããå ¥åããã°ãyou are not a valid userããåºããããããç¶æ ã«ãªãã°ãæºåã®ç¬¬2段éãå®äºããŠããã
ãªãããã¹ã¯ãŒãã®æ å ±ãæ ŒçŽãããŠãã cdwdoc-2023-001_challenge_passwd.txt ã®1è¡ç®ã¯ä»¥äžã®ããã«ãªã£ãŠããã
user1:9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0ã:ãã§åºåãããŠããŠã1ã€ç®ã®ã«ã©ã ã¯ãŠãŒã¶ãŒåã§ã2ã€ç®ã®ã«ã©ã ããã¹ã¯ãŒãã®ããã·ã¥å€ã«ãªã£ãŠããããã ããaaaããšããæååã®SHA256ãµã å€ã確èªããŠã¿ããã
$ printf aaa | openssl sha256
SHA256(stdin)= 9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0user1 ã«ã€ããŠã¯æ£ãããã¹ã¯ãŒãããaaaãã§ããããšã¯åãã£ãã
ããã§ãããããŠãä»åã®åºé¡ã®è©³çްãã©ã®ãããªãã®ããäŒããããšãã§ããã
åé¡ãšã¯ã€ãŸããuser2 ã«ã€ããŠãã®æ£ãããã¹ã¯ãŒããç¥ãããšãªããyou are a valid user!ããšè¡šç€ºãããããã«ããã°ã©ã ãæ··ä¹±ãããŠã¿ãããšããããšã ã
ãªãããã¹ã¯ãŒããã§ãããã«å ¥åãããšããŠã以äžã®ããã«å»¶ã ãšãyou are not a valid userããšåºç¶ããã¯ãã ã
$ ./cdwdoc-2023-001_challenge.sh user2 aaa
error: you are not a valid user
$ ./cdwdoc-2023-001_challenge.sh user2 abcde
error: you are not a valid user
$ ./cdwdoc-2023-001_challenge.sh user2 grhgergregrgghrtehger
error: you are not a valid userå®è¡æã«ã¯ãæã¡èŸŒãã³ãã³ãã®æåã®éšåã¯
./cdwdoc-2023-001_challenge.sh user2 ãšãããšãããŸã§ã¯ãŸã£ããåãã§ãªããã°ãªããªããã€ãŸãã1ã€ç®ã®åŒæ°ã¯å¿ ã "user2" ãšãã5æåã ã
ä»ã«ãã以äžã®å¶çŽãããã
ãã£ã¬ã¯ããªãç§»åããŠã¯ãªããªãã
ã·ã§ã«é¢æ°ã alias ãç°å¢å€æ°ã®é¡ãå®çŸ©ããŠã¯ãªããªãã
ãããªããã¡ã€ã«ãåé€ããããªããŒã ãããå 容ã倿Žãããæ°èŠäœæãããããŠã¯ãªããªãã
ãããªããã¡ã€ã«ã®æš©éã倿ŽããŠã¯ãªããªãã
cdwdoc-2023-001_challenge.sh ã cdwdoc-2023-001_challenge2.sh ã®å 容ãå å·¥ããããã°ã©ã ãå®è¡ããŠã¯ãªããªãã
å€éšãµãŒããŒã®åãåããããUnixã®åºæ¬çãªããŒã«ã»ãã以å€ã®ããã°ã©ã ã䜿çšããŠã¯ãªããªãã
Bashç¹æã®æ©èœã䜿ã£ãŠã¯ãªããªããã¿ãŒããã«ã«ãããŠãããã ããcdwdoc-2023-001_challenge.sh ã®äžè¡ç®ãã#!/bin/shãã§ã¯ãªãã#!/bin/dashãã ã£ããã#!/bin/ashãã ã£ããã#!/bin/busybox shãã ã£ããã#!/bin/kshãã ã£ããã#!/bin/mkshãã ã£ããããŠããæ»æãæåããããã«ããªããã°ãªããªãïŒããããã®ã·ã§ã«ãã·ã¹ãã ã«ååšããŠããªãïŒã
éåžžã®ã·ã§ã«ã§ã¯ãªããããªå¥ã®ããã°ã©ã ãã cdwdoc-2023-001_challenge.sh ãåŒãã§ã¯ãªããªãããããŸã§ãã¿ãŒããã«ããå®è¡ããæ®éã®ã·ã§ã«ã¹ã¯ãªãããšã㊠cdwdoc-2023-001_challenge.sh ãè§£éãããããã«ããªããã°ãªããªãã
æ»ææåæããyou are a valid user!ããšããæååã¯ããããŸã§ã cdwdoc-2023-001_challenge.sh ã«åºåãããªããã°ãªããªãã
æ»ææåæãcdwdoc-2023-001_challenge.sh ã®çµäºã¹ããŒã¿ã¹ã 0 ã«ãªãããã«ããªããã°ãªããªãã
ãåé€ããããªããŒã ããã倿Žãããæ°èŠäœæãããè€æ°åå®è¡ããããŠã¯ãªããªããšããã®ã¯æçµçãªè§£çã®äžã§ãšããããšã§ãã£ãŠãè§£çã«ãã©ãçããŸã§ã«ãããã詊è¡é¯èª€ããã®ã¯ããŸããªãã
ãã¡ããããããã詊ããããšãæçµçãªè§£çã®éã«ã¯ãã¹ãŠå ã«æ»ããªããã°ãªããªãã
ãã£ãšããããªå¶çŽãã€ããªããšè§£çïŒè§£æ³ïŒãç¡æ°ã«ãããããªç¶æ ã«ãªã£ãŠããŸã£ãŠãããããããªãããããŸãããããæžããšããèªäœããã³ãã«ãªãå¯èœæ§ãããããã§ã¯ããã®ã§ããã®ãžãã«ããŠããã
ãšããã§ãã³ãŒãã®äžéšãä¿®æ£ããã°macOSã§ããã¡ãããšè§£ããåé¡ããšããŠæç«ããå¯èœæ§ããããäŸãã° cdwdoc-2023-001_challenge2.sh ã®äžã® get_hash() ã®å®çŸ©ãã以äžã®ããã«äžèº«ãäžè¡ã ãã®ãã®ã«æžãæããŠããŸãã
get_hash() {
openssl sha256 | awk '{print $NF}'
}çè ã¯åºé ã®ãã¢æ©ã®MacBook Proã®macOS Ventura 13.2ïŒBuild 22D49ïŒã§ã³ãœã³ãœãšç¢ºèªããã ããªã®ã§ãæ¬åœã«ããã§ãããã©ããã¯ããåãããªãããç«ã¡é£²ã¿ããªãã¬ãç«ã¡ãããã°ãã§ããã
GNU coreutilsãå ¥ã£ãŠãããªã©ããã§ã« sha256sum ã³ãã³ããå©çšå¯èœã§ããã°ç¹ã«ä¿®æ£ããªããŠãmacOSã§ãã®ãŸãŸåããããããªãã
2023幎3æçŸåšã«ãããŠã¯ãå€å°æ¹å€ãå¿ èŠã«ãªããããããªããåºæ¬çã«ã¯ã»ãšãã©ãã¹ãŠã®Unixã«ãããŠè§£ããåé¡ã«ãªã£ãŠãããšçè ã¯èããŠããã
å®éã®ãšããããã©ãŠã¶äžã§åãLinuxã®jor1kã§ãã¡ãããšè§£ããã
ãã®èšäºã§ã¯ãåè¿°ã®åé ã®åºé¡ã®ã³ãŒãã«ã€ããŠäœåºŠãçŽæ¥çã«èšåããŠããããè€æ°ç®æã«åæ£ããŠããããã®ç®æã¯ã_challengeãã§ããŒãžå æ€çŽ¢ããã°èŠã€ããã¯ãã§ããã
ãªããçè ãæ³å®ããŠããè§£æ³ïŒæ»ç¥æ³ïŒã«ã€ããŠã¯ãã®èšäºã®çµç€ã®ã»ã¯ã·ã§ã³ãåé ã®åºé¡ã®è§£çäŸãã«æžããŠããã
ã
æ ¹æ¬åçã«ã€ããŠ
ã
â
â
â
â
â
â
以äžãæ ¹æ¬åçã«ã€ããŠè§£èª¬ããã
åé ã®åºé¡ïŒåã®ã»ã¯ã·ã§ã³ã§æç€ºããåºé¡ïŒãããŒãã³ãã§æ»ç¥ããã人ã¯ããããå ã¯èªãŸãªãããã«ã
â
â
â
â
â
â
ã
æ ¹æ¬åçãçã説æãããšã以äžã®ããã«ãªãã
人éå士ã®å¶ã¿ã«ãããŠãYESãšNOã¯å¯Ÿçã§ã¯ãªããåãããã«ãã³ã³ãã¥ãŒã¿ã«ãããŠã true ãš false ã¯å¯Ÿçã§ã¯ãªãã
ãã£ãããã ãã§ãã·ã§ã«ã¹ã¯ãªããã«è©³ãã人ãªã倧ããªãã³ãã«ãªãã®ã§ã¯ãªãã ãããã
ããã°ãããã第äžãã³ããã«ããŠãããäžåºŠææŠããŠã¿ãã®ããããããããªãã
ãããã¯ãçè ãæ³åã ã«ããªããããªæ¹æ³ã§æ»ç¥ããŠããŸã£ã人ãããã®ã第äžãã³ãããããšã«å¥ã®è§£ãæ¢ããŠã¿ãã®ããããããããªãã
ãªããçè ãæ³å®ããŠããæ¹æ³ã§æ»ç¥ã«æåãã人ãªãããªãäžèšã®èšãæ¹ããã³ããšãããã®ããåããã¯ãã§ããã
ã
èµ·ãã£ãŠããããšã«ã€ããŠã®ãããå°ãçŸå®çãªè§£èª¬
ã
â
â
â
â
â
â
以äžãåçã«ã€ããŠãã詳现ã«è§£èª¬ããŠããã
ã·ã§ã«ã®è©³çްãªä»æ§ãå¿ããŠããŸã£ããšãã人ã«ããããçšåºŠé æ ®ããŠæžããŠããã€ããã§ããã
åã®ã»ã¯ã·ã§ã³ã§æç€ºããã第äžãã³ããã ãã§åé ã®åºé¡ãæ»ç¥ããã人ã¯ããããå ã¯èªãŸãªãããã«ã
â
â
â
â
â
â
ã
ãã®ALTLãªãŒããŒãããŒïŒALTL overflowïŒã®åçã¯ãçè ã2012幎ã®åŸåã2013幎ã®ååãããã«æãã€ãããã®ã§ããã
ããããåãããšãæãã€ãã人ã¯çè 以å€ã«ãããã ãããããããã§ã«å¥ã®ååãã€ããŠããã®ãããããªãã
倧çãšããŠã¯ããã¯ããã°ã©ãã³ã°ã®å ç¢æ§ã«ã€ããŠã®è©±é¡ã§ãããã»ãã¥ãªãã£ãªã¹ã¯ã«ã€ãªãããããªã±ãŒã¹ã¯ããäžéšã§ãããšçè ã¯èããŠããã
ãŸããéçšã»ç®¡çã®èŠç¹ãšããããã¯ã³ãŒãã£ã³ã°ã¹ã¿ã€ã«å¯ãã®è©±ã§ãããã·ã¹ãã æ§æã®èŠç¹ãšããããã¯èšèªèšèšå¯ãã»ã©ã€ãã©ãªèšèšå¯ãã®è©±ã§ããããããŠãšã³ãžãã¢ãªã³ã°ãããã¯ã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ãšããŠã¯éåžžã«æ ¹æ¬çã§å²åŠçãªãã®ãåãã§ããã人工èšèªã®ããæ¹ãšããŠã®æ®éçãªæ§è³ªã«é¢ããé åã§ãããªãããæ°åŠã®åºç€è«å¯ãã®è©±ã§ã¯ãªãã
ãªããçè ã¯ãã®ä»¶ã«ã€ããŠã®è匱æ§ã®å®äŸãèŠã€ããããšã¯ãªããå®äŸãšããã®ã¯ã€ãŸããçŸå®ã«çšŒåããŠããã·ã¹ãã ããªãŒãã³ãœãŒã¹ã®ãããžã§ã¯ããªã©ã§ãããçŸå®çã«æªçšå¯èœïŒexploitableïŒãªè匱æ§ã«ãªã£ãŠãããšãããããªãããããäŸã®ããšã§ããã
å®éã«è匱æ§ã«ã€ãªãã£ãŠãããããªäŸãå¿ ãããã¯ãã ãšãã確信ã¯ãããã®ã®ãããäžçäžã®ããããã³ãŒãã粟æ»ããŠã©ãã«ãèŠã€ãããªãã£ããšããŠããçè ã«ãšã£ãŠã¯ã©ãã§ãããããšã§ããã
çŸå®ã«ååšããŠããå±±ã§ã¯ãªããèªåã®é ã®äžã ãã«ååšããŠããä»®æ³çãªå±±ãç»ãããšã®ã»ãããçè ã«ãšã£ãŠã¯éèŠãªã®ã§ããã
ããããããã§ä»å説æããALTLãªãŒããŒãããŒã«é¢ããŠã¯ã2023幎3æ26æ¥æç¹ã§ã¯çŽç²ã«çè«ã ãããã£ãŠãéå»ã®äºäŸã«ã€ããŠã¯äžåç¥ããªããèªåã§èŠã€ããè匱æ§ãäžåååšããªããšããç¶æ ã§ããã
ã¡ãªã¿ã«çè ãå»å¹ŽïŒ2022幎ïŒã«å ±åããsedã€ã³ãžã§ã¯ã·ã§ã³ã«ã€ããŠã¯ããŸãçè«çã«ãããããšããããšã«æ°ã¥ããŠæ»æãã¿ãŒã³ãçè«çã«ãæŽåãããŠããèªåã§å®äŸãæ¢ããŠã¿ãŠãå®éã«å ±åã»ä¿®æ£ã«ã€ãªãã£ããããã zgrep ããã³ xzgrep ã® CVE-2022-1271 ãšãHestiaCPã® CVE-2022-1509 ã§ããã
sedã€ã³ãžã§ã¯ã·ã§ã³ïŒsed injectionïŒãšããã®ã¯ããã®åã®éãSQLã€ã³ãžã§ã¯ã·ã§ã³ã®sedçãçè ãããåŒãã§ãããã®ã§ãããSQLã®ã³ãŒããåçã«çæããæã«èµ·ããã®ãSQLã€ã³ãžã§ã¯ã·ã§ã³ã ããåãããã«sedã®ã³ãŒããåçã«çæããæïŒå žåçã«ã¯ã·ã§ã«ã¹ã¯ãªããã®äžã« "s/$before/$after/" ã®ãããªãã¿ãŒã³ãããæïŒã«èµ·ããã®ãsedã€ã³ãžã§ã¯ã·ã§ã³ã§ãããã ããåŒç§°ã®ããæ¹ããCRLFã€ã³ãžã§ã¯ã·ã§ã³ããšãã£ããã®ããããSQLã€ã³ãžã§ã¯ã·ã§ã³ãã«è¿ããããããããšãå«ããŠã®ããSQLã€ã³ãžã§ã¯ã·ã§ã³ã®sedçããªã®ã§ããã
ãã®sedã€ã³ãžã§ã¯ã·ã§ã³ã«ã€ããŠã¯ãsed ãã·ã§ã«ã¹ã¯ãªãããšã¯çŽæ¥é¢ä¿ã®ãªãçè«çãªããšã«ã€ããŠããããèããŠããæã«ããã®å¯ç£ç©ãšããŠsedã€ã³ãžã§ã¯ã·ã§ã³ãšãããã®ããããããšããããšã«2013幎ã®åŸåã«æ°ã¥ããã®ãçºç«¯ã§ããã
ãªããçè ããsedã€ã³ãžã§ã¯ã·ã§ã³ããšåŒãã§ãããããªè匱æ§ãšããŠã¯ãäŸãã°2005å¹Žã®æç¹ã§ãã§ã« CVE-2005-0758 ïŒzgrep ãªã©ã®è匱æ§ïŒããã£ããããªã®ã ããçè ãsedã€ã³ãžã§ã¯ã·ã§ã³ã®å¯èœæ§ã«æ°ã¥ããæã«ã¯ãã®è匱æ§ã®ååšã«ã€ããŠã¯ç¥ããªãã£ãããããŠçµæçã«ã¯ CVE-2022-1271 ãšããã®ã¯ãCVE-2005-0758 ã«å¯Ÿå¿ããããã«è¿œå ãããsedã€ã³ãžã§ã¯ã·ã§ã³ãèµ·ãããªãããã«ããããã®ã»ãã¥ãªãã£å¯Ÿçã®ã³ãŒããããæããæ¹æ³ãããããšãçè ãçºèŠããããšããããšã«ãªãã®ã ã
ä»åæç€ºããALTLãªãŒããŒãããŒã«ã€ããŠã¯ãçè«çãªæ¢çŽ¢ã®éã®å¯ç£ç©ã®ãããªãã®ã§ã¯ãªããã¯ããŸãã¯å¶ç¶ã ã
2012幎åŸåã2013幎ååã«èªäœã®ã·ã§ã«ã¹ã¯ãªãããæžãéã«æ§ã ãªæ€èšŒãããŠããæããArgument list too longããšãããšã©ãŒãåºãããšãããã®ã«å¶ç¶æ°ã¥ããã®ãçºç«¯ã§ããããã®æç¹ã§ã¯åçŽã«çè ã¯ãã®ãšã©ãŒã®ååšã ARG_MAX ã®ååšãç¥ããªãã£ãããã«ããäœãªãã ããã¯ããšããé©ããšãšãã«è²ããªå¯èœæ§ãèããããã ããããŠãã®ãã¡ã«ãã»ãã¥ãªãã£ãªã¹ã¯ã«ããªãããããšã«æ°ã¥ãããšããããã§ããã
ãããALTLãªãŒããŒãããŒã®ãALTLããšããã®ã¯ãArgument list too longãã®ç¥ã§ããã
å®éã«ã¯ãArgument list too longãã®ãšã©ãŒãç®ã«ããããšã¯ããããéå»ã«ããã£ãã¯ãã§ã¯ããã®ã ãããããããã®é ã¯ãã®ãšã©ãŒã¯åã«ã¿ãŒããã«ããã·ã§ã«ãå©çšããŠããæã®ãã¡ã€ã«ã®å±éã«ãŸã€ãããã®ã ããããã«ããæã£ãŠããªãã£ãã®ã ããã
ä»åãã®èšäºã§èª¬æããããšããŠããALTLãªãŒããŒãããŒãšããã®ã¯ã屿çã«èµ·ãã£ãŠããçŸè±¡ã ãã«çç®ããã°sedã€ã³ãžã§ã¯ã·ã§ã³ãšã¯äœã®é¢ä¿ããªãã
ããããsedã€ã³ãžã§ã¯ã·ã§ã³ã®å¯ŸçãããããšããŠäœããã®æååã®ãã§ãã¯ãç¡å®³åïŒãµãã¿ã€ãºïŒã®ããã®ã³ãŒããããæã«ãALTLãªãŒããŒãããŒãåŒãèµ·ããããšã«ãã£ãŠãã®å¯Ÿçãããæããããšãã§ãããããªå Žåããçè«çã«ã¯ååšããŠããã®ã§ããããŸããããã¯ãããŸã§ããçè«çã«ã¯ãšããããšã«ãªããã
ããã«ããã°ãSQLã€ã³ãžã§ã¯ã·ã§ã³ãå«ããããããã€ã³ãžã§ã¯ã·ã§ã³ç³»ã®è匱æ§ã¯ãã¡ããããã£ã¬ã¯ããªãã©ããŒãµã«ãªã©ãå«ããæ§ã ãªè匱æ§ã®å¯Ÿçã®ããã®ã³ãŒãããALTLãªãŒããŒãããŒã«ãã£ãŠç¡å¹åã§ããå¯èœæ§ãããããšã«ãªãã
ã§ã¯ããã®ãArgument list too longããšãããšã©ãŒãå®éã«æå ã§èµ·ããç°¡åãªäŸãèŠãŠã¿ããã
ãã¡ã€ã«ã倧éã«çæããŠãããã¡ã€ã«å±éãå©çšããæ¹æ³ãããããALTLãªãŒããŒãããŒã«ãããŠéèŠãªã®ã¯åäžã®å·šå€§ãªæååã§ããã
ããããããã§ããŸãã¯Unixã®ã·ã§ã«ç°å¢ã§å·šå€§ãªæååãã©ããã£ãŠæè»œã«çæããããèããã
yes ã³ãã³ããå©çšããæ¹æ³ã¯ä»¥äžã®ãšããã§ããããã®äŸã§ã¯10æåã ãã§ããã
$ str="$(yes 'a' | head -10 | tr -d '\n')"
$ /bin/echo "$str"
aaaaaaaaaaãhead -10ãã®æ°åã®éšåãå€ããã°ã奜ããªãµã€ãºã®æååãçæã§ããã
yes ã䜿ããã« seq ã jot ã dd ã printf ã§ã䌌ãããšãã§ããããyes ã®çµæãå å·¥ããã»ããå¿çšãå¹ãããããæ¬¡ã®ã»ã¯ã·ã§ã³ãã·ã§ã«ã¹ã¯ãªããã«ãããçŸå®çãªæ³šæç¹ãã§å®éã«ç»å Žãããã2æå以äžã®æååãé£ç¶ããããæã«äŸ¿å©ãªã®ã ã
äŸãã°ãABC,ããšããæååãç¹°ãè¿ãããå Žåã
$ str="$(yes 'ABC,' | head -10 | tr -d '\n')"
$ /bin/echo "$str"
ABC,ABC,ABC,ABC,ABC,ABC,ABC,ABC,ABC,ABC,ã../ããšããæååãç¹°ãè¿ãããå Žåã
$ str="$(yes '../' | head -10 | tr -d '\n')"
$ /bin/echo "$str"
../../../../../../../../../../GNU coreutilsãåæã«ãããªããyes ãš head ã®çµã¿åããã¯ãshuf -rãã§ã代çšã§ããããã ãçè ã¯ããã« shuf ã®ãªãã·ã§ã³ã®ä»æ§ãå¿ããŠããŸããSolaris 11.4ïŒ2018幎ãªãªãŒã¹ïŒã®å Žå㯠yes ãš head ãçµã¿åãããŠå·šå€§ãªæååãçæããã®ã¯é ãã®ã§ shuf ã䜿ããšãããããããªããyes ã SIGPIPE ã§çµäºããã®ãå°ãæã«ã shuf ã¯äœ¿ããããªããshuf ã« -r ãªãã·ã§ã³ãç»å Žããã®ã¯GNU coreutils 8.22ïŒ2013幎ãªãªãŒã¹ïŒã§ããã
ãšããã§ãåè«ãç®èã§ã¯ãªãçè ã¯ããœãŒã¹ã³ãŒãããã第äžçŽã®ããã¥ã¡ã³ããã§ãããšèããŠãããã³ãŒããšãããã®ã¯ãããŠãã人éãšã³ã³ãã¥ãŒã¿ãšããã®åæ¹ããèªãããããšãå¿åããŠããã®ã ããã
ã ãããã®èšäºã®äžã§äžèšã®ããã«ã³ãŒãã®æçãã³ãã³ãã®äŸãåºãŠæ¥ãããå®éã«å®è¡ããŠçµæã確ãããŠã¿ãŠãããã«éšåçã«å€æŽããŠå®è¡ããŠã¿ãããããªã©ããµãŒããšèªã¿æµãã®ã§ã¯ãªãååŒãããªããèªããšããããšãæšå¥šãããã®ã§ãããGUIã®ã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¹ããŒã«ç»é¢ã®ãã£ããã£ã貌ãä»ããŠããã®ãšã¯ãããéãã®ã ã
ã§ã¯ããã§ãå®éã«å·šå€§ãªæååãçæããŠãšã©ãŒãèµ·ãããŠã¿ãããšã«ããããhead -10ãã®ãšãããå·šå€§ãªæ°ã«å€æŽããŠçæãã倿° str ãã/bin/echo ã®åŒæ°ãšããŠåºåããã®ã§ããããããšãArgument list too longããšãããšã©ãŒãåºãã¯ãã§ããã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ /bin/echo "$str" | wc -c
bash: /bin/echo: Argument list too long
0ãã®äŸã§ã¯ããArgument list too longããšãããšã©ãŒã¡ãã»ãŒãžãåºåããŠããã®ã¯ bash ã§ãããbash ã execve(2) ãªã©ã®ã·ã¹ãã ã³ãŒã«ã§ãµã€ãºã®å¶éã«çŽé¢ããããããã®ãšã©ãŒã¡ãã»ãŒãžãåºåããã®ã ããããã /bin/echo ã¯å®è¡ã§ããªãã£ãããã/bin/echo ããšã©ãŒã¡ãã»ãŒãžãåºåããŠããããã§ã¯ãªãã
ãbash -cãã®æã®æåã§ãããªã strace ã§ç°¡æçã«è¿œè·¡ã§ãããããããªãããªãã以äžã®ãããªãã®ã«ã€ããŠã¯çºããã ããæšå¥šã
$ strace bash -c 'str=$(yes a | head -999999 | tr -d "\n") ; /bin/echo "$str" 2> /dev/null' 2>&1 | tail -18
rt_sigprocmask(SIG_SETMASK, [INT TERM CHLD], NULL, 8) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff1a1f2ea10) = 73005
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=73005, si_uid=1000, si_status=126, si_utime=0, si_stime=0} ---
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 126}], WNOHANG, NULL) = 73005
wait4(-1, 0x7ffef70b3590, WNOHANG, NULL) = -1 ECHILD (No child processes)
rt_sigreturn({mask=[]}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x563c750b3dc0, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ff1a1f73520}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ff1a1f73520}, 8) = 0
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ff1a1f73520}, {sa_handler=0x563c750b3dc0, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7ff1a1f73520}, 8) = 0
ioctl(2, TIOCGWINSZ, 0x7ffef70b3c00) = -1 ENOTTY (Inappropriate ioctl for device)
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
exit_group(126) = ?
+++ exited with 126 +++Solaris 11ïŒSunOS 5.11ïŒãªã©ãç°å¢ã«ãã£ãŠã¯999999åçšåºŠã§ã¯ãšã©ãŒãåºãªããããããªãã
ãŸããSolaris 11ãªã©ã®ããã«ãArgument list too longãã§ã¯ãªããArg list too longãã ã£ãããããããããªãããç°å¢ã«ãã£ãŠã¯ãåŒæ°ãªã¹ããé·ãããŸããããåŒæ°ã®ãªã¹ããé·ãããŸããã®ãããªæ¥æ¬èªã®ãšã©ãŒã¡ãã»ãŒãžã«ãªããããããªãã
äŒçµ±çã«ã¯ãUnixã«ãããŠãArgument list too longãã®ãšã©ãŒãšé¢é£ãæ·±ãã·ã¹ãã æ§æå€æ°ïŒsystem configuration variableïŒã¯ ARG_MAX ã§ããããŸãããã¯ã宿°ãšããŠã® ARG_MAX ã¯ã«ãŒãã«ã®ã³ã³ãã€ã«æã«å€æŽå¯èœã§ããã
ãã ããLinuxã«ãããŠã¯ã«ãŒãã«2.6.23ïŒ2007幎10æãªãªãŒã¹ïŒã«ãã㊠ARG_MAX åšèŸºã®æåãå€§å¹ ã«å€æŽãããŠãããããã«ã«ãŒãã«2.6.25ïŒ2008幎4æãªãªãŒã¹ïŒã§ãè¥å¹²ã®å€æŽããã£ãããã ã
ãŸãããã®èšäºã§èããŠãããããªãã®ã¯æ»æã®ããã«1ã€ã®åŒæ°ãæå³çã«å·šå€§ã«ããããšããã®ãã¡ã€ã³ãªããã§ãã«ãŒãã«2.6.23以éã®Linuxã«ãããŠã¯ã³ãã³ãã©ã€ã³å šäœã®ãµã€ãºããã1ã€ã®åŒæ°ã®å¶éã«ã€ããŠã®ãã¯ã宿° MAX_ARG_STRLEN ãéèŠãšããããšã«ãªãã®ãããããªãã
ã·ã§ã«ã¹ã¯ãªããã®æžç±ãšããŠã¯æ¯èŒçæè¿ã®ãã®ãäŸãã°ãUNIXã·ã§ã«ã¹ã¯ãªãã ãã¹ã¿ãŒããŒã¹132ãïŒ2014幎6æåïŒã®ã032 倧éã®ãã°ãã¡ã€ã«ããããã£ã¬ã¯ããªå ã®ãã¡ã€ã«ã«äžæ¬ããã³ãã³ãã宿œãããã®ã»ã¯ã·ã§ã³ã«ãããŠããLinuxã«ãŒãã«2.6.23ããã³ãã以éã«ããã ARG_MAX åšèŸºã®ããšã«ã€ããŠã¯èæ ®ããŠããªããããªè§£èª¬ããããŠãããããã®ã§èŠæ³šæã§ããã
Linuxã«ããããã®ãããã®äºæ ã«ã€ããŠã¯ãçè ãããŸã詳ããã¯ç¥ããªãã以äžã®URLãåèã«ãªããããããªãã
The maximum length of arguments for a new process
https://www.in-ulm.de/~mascheck/various/argmax/
ãã®ããŒãžã®å 容ã¯éèŠãªæ å ±ãªã®ã§ãã¢ãŒã«ã€ããµã€ãã®URLãããã€ãæç€ºããŠããã
https://web.archive.org/web/20230131200821/https://www.in-ulm.de/~mascheck/various/argmax/
https://megalodon.jp/2023-0215-0155-41/https://www.in-ulm.de:443/~mascheck/various/argmax/
Qiitaã§ã·ã§ã«ã¹ã¯ãªããã«é¢ããåãŸããããªã¥ãŒã ã®æç« ãç¶ç¶çã«ãã¹ããç¶ããŠãã人ã«ãã2022幎12æã®ä»¥äžã®è³ªåã®æçš¿ãåèã«ãªããããããªãã
[Q&A] xargsã³ãã³ãã®åŒæ°åå²ã®ããããªæåã«ã€ããŠã®è³ªå - Qiita
https://qiita.com/ko1nksm/questions/88cd031565e7a3356849
2014幎ã®ãã®ã ããStack Exchangeã§ã®ä»¥äžã®åçã«ã MAX_ARG_STRLEN ãå«ãã詳现ãªè§£èª¬ãããã
kernel - What defines the maximum size for a command single argument? - Unix & Linux Stack Exchange
https://unix.stackexchange.com/questions/120642/what-defines-the-maximum-size-for-a-command-single-argument/120842#120842
ã«ãŒãã«2.6.23ã§ ARG_MAX åšèŸºã®æåãå€§å¹ ã«å€ããåã®Linuxã«ãŒãã«ãæ°è»œã«è©Šãã«ã¯ãKnoppix 5.1.1ïŒ2007幎1æãªãªãŒã¹ã§ã«ãŒãã«2.6.19ïŒã®isoãVirtualBoxäžã§èµ·åããŠã¿ãã®ããããããããªãã
Knoppix 5.1.1 CD (English) : Klaus Knopper : Free Download, Borrow, and Streaming : Internet Archive
https://archive.org/details/KNOPPIXV5.1.1CD20070104EN
$ openssl md5 KNOPPIX_V5.1.1CD-2007-01-04-EN.iso
MD5(KNOPPIX_V5.1.1CD-2007-01-04-EN.iso)= 379e2f9712834c8cef3efa6912f30755以äžã¯Knoppix 5.1.1ã§ã® ARG_MAX åšèŸºã libcã®ããŒãžã§ã³ãªã©ããããã£ãç°å¢æ å ±ã«ã€ããŠãããšããããã¯ãçºããã ãããæšå¥šã
$ getconf ARG_MAX
131072
$ getconf _POSIX_ARG_MAX
131072
$ ulimit -s
8192
$ arch
i686
$ getconf GNU_LIBC_VERSION
glibc 2.3.6
$ ldd --version
ldd (GNU libc) 2.3.6
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
$ cat /proc/version
Linux version 2.6.19 (root@Knoppix) (gcc version 4.1.2 20061028 (prerelease) (Debian 4.1.1-19)) #7 SMP PREEMPT Sun Dec 17 22:01:07 CET 2006
$ dpkg -S /usr/bin/getconf
libc6: /usr/bin/getconf
$ dpkg -S /usr/bin/ldd
libc6: /usr/bin/ldd2023幎3æçŸåšã«ãããŠã¯ãARG_MAX åšèŸºã®æåãå€§å¹ ã«å€ãã£ãããšã®Linuxã«ãŒãã«ã§ããã€ã€glibcç°å¢ã§ã¯ãªããããªãã®ãæ°è»œã«è©Šãã«ã¯Alpine Linuxãé©ããŠãããããããªãããgetconf ARG_MAXãã¯ãŸãã§æã®Linuxã®ããã« 131072 ãåºåããã
以äžã¯Alpine Linux 3.17.1 Standard EditionïŒ2022幎ãªãªãŒã¹ïŒã®å Žåã
$ getconf ARG_MAX
131072
$ getconf _POSIX_ARG_MAX
4096
$ ulimit -s
8192
$ arch
x86_64
$ getconf GNU_LIBC_VERSION
getconf: GNU_LIBC_VERSION: unknown variable
$ ldd --version
musl libc (x86_64)
Version 1.2.3
Dynamic Program Loader
Usage: /lib/ld-musl-x86_64.so.1 [options] [--] pathname
$ cat /proc/version
Linux version 5.15.90-0-lts (buildozer@build-3-17-x86_64) (gcc (Alpine 12.2.1_git20220924-r4) 12.2.1 20220924, GNU ld (GNU Binutils) 2.39) #1-Alpine SMP Wed, 25 Jan 2023 08:18:30 +0000以äžã¯Lubuntu 22.04.1ïŒ2022幎ãªãªãŒã¹ïŒã®å Žåã
$ getconf ARG_MAX
2097152
$ getconf _POSIX_ARG_MAX
2097152
$ ulimit -s
8192
$ arch
x86_64
$ getconf GNU_LIBC_VERSION
glibc 2.35
$ ldd --version
ldd (Ubuntu GLIBC 2.35-0ubuntu3.1) 2.35
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
$ cat /proc/version
Linux version 5.15.0-66-generic (buildd@lcy02-amd64-076) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #73-Ubuntu SMP Fri Feb 3 14:23:37 UTC 2023
$ dpkg -S /usr/bin/getconf
libc-bin: /usr/bin/getconf
$ dpkg -S /usr/bin/ldd
libc-bin: /usr/bin/lddFedora 37 WorkstationãSlackware 15.0ãå«ããŠãã¢ãã³ãª64ãããã®Linuxãã¹ã¯ãããç°å¢ã§ã¯ãçŽ çŽã«ã€ã³ã¹ããŒã«ããã°ãããŠããgetconf ARG_MAXãããgetconf _POSIX_ARG_MAXãã 2097152ïŒ20MiBïŒã«ãªãã
ã¡ãªã¿ã«Tiny Core Linux 13.1ã®CorePlusçã«ã¯ getconf ããªãã£ããããã
æè¿ã®Linuxéå®ã®ããšãšããŠ1ã€ã®åŒæ°ã®é·ãå¶éã® MAX_ARG_STRLEN ã®ã»ããéèŠãããããªããšè¿°ã¹ããããã® MAX_ARG_STRLEN ã«ã€ããŠã¯ãglibcç°å¢ã§ãgetconf MAX_ARG_STRLENããå®è¡ããŠããUnrecognized variableããšåºãã
$ getconf MAX_ARG_STRLEN
getconf: Unrecognized variable `MAX_ARG_STRLEN'/usr/include/linux/binfmts.h ãšããã€ã³ã¯ã«ãŒããã¡ã€ã«ãããå Žåã«ã¯ã以äžã®ãããªãã¯ã宿° MAX_ARG_STRLEN ã®å®çŸ©ã®è¡ãèŠã€ãããããããªãïŒãããŠKnoppix 5.1.1ã®ãããªå€ãç°å¢ã§ã¯ binfmts.h ã«ãã®ãããªè¡ã¯ãªã代ããã« MAX_ARG_PAGES ã«ã€ããŠã®è¡ãããïŒã
$ grep -i 'define.*max_arg_strlen' /usr/include/linux/binfmts.h
#define MAX_ARG_STRLEN (PAGE_SIZE * 32)2023幎3ææç¹ã§ã¯ãUbuntuãå«ããDebianç³»ã䜿ã£ãŠã㊠libc6-dev ã linux-libc-dev ãªã©ã®ããã±ãŒãžãå ¥ã£ãŠããã /usr/include/ 以äžã«ã€ã³ã¯ã«ãŒããã¡ã€ã«ããªãå Žåã¯ã以äžã®ããã«ãããšãã¯ã宿° MAX_ARG_STRLEN ãå®çŸ©ãããŠããã€ã³ã¯ã«ãŒããã¡ã€ã«ãèŠã€ããããããããããªãã
$ find /usr/src -type f | xargs grep -i max_arg_strlen 2> /dev/nullãšããã§ãåè¿°ã®ããã« binfmts.h ã§ã¯ MAX_ARG_STRLEN ã¯ã(PAGE_SIZE * 32)ããšå®çŸ©ãããŠããã
ããã¯ã€ãŸãããŒãžãµã€ãºã®32åãHugePagesã®æ©èœã䜿ã£ãŠãããããªããã»ã¹ã§ãªãéããLinuxã§ x86_64 ã¢ãŒããã¯ãã£ãªãããŒãžãµã€ãºã¯ 4096ïŒ4KiBïŒã§ããã
$ getconf PAGE_SIZE
4096
$ arch
x86_644096 ã®32åãšããããšã¯ã131072ïŒ128KiBïŒã
$ awk 'BEGIN{ print 4096 * 32 }'
1310721ã€ã®åŒæ°ã131072ãã€ãïŒ128KiBïŒãè¶ ãããã©ãããéèŠãªããã ã
2023幎3æ26æ¥æç¹ã§ã®ææ°ã®Linuxã«ãŒãã«ã®ãœãŒã¹ããªãŒã® exec.c ã«ãããŠãMAX_ARG_STRLEN ã«ããé·ããã§ãã¯ã¯ä»¥äžã®ç®æã§ããã
https://github.com/torvalds/linux/blob/e1212e9b6f06016c62b1ee6fe7772293b90e695a/fs/exec.c#L292-L295
#ifdef ã«ããããã®ç®æã¯ã«ãŒãã«ã³ã³ãã£ã°ã¬ãŒã·ã§ã³ã® CONFIG_MMU ãæå¹ã®æã®ã¿ã³ã³ãã€ã«ãããã
$ grep -i config_mmu= < /boot/config-$(uname -r)
CONFIG_MMU=yALTLãªãŒããŒãããŒãæå³çã«åŒãèµ·ããããšããæã«ã¯ããããã£ãã«ãŒãã«ã®æåã®è©³çްã«ã€ããŠæ£ç¢ºã«ææ¡ããŠããå¿ èŠã¯ãªãã
ãã ããæè¿ã®Linuxã«ãããALTLãªãŒããŒãããŒã«ã€ããŠã¯ãã³ãã³ãã©ã€ã³å šäœã®é·ãå¶éãš1ã€ã®åŒæ°ã®é·ãå¶éããã®äž¡æ¹ã®å¶éãååšããŠããã®ã ãšããããšãçè§£ããŠããå¿ èŠã¯ããã
2.6.23ïŒ2007幎10æãªãªãŒã¹ïŒããã³ãã以éã®ã«ãŒãã«ã®Linuxã§ã¯ãã/bin/echo "$str$str"ãã®ããã«é£çµãããšãšã©ãŒã«ãªãã®ã«ã/bin/echo "$str" "$str"ãã®ããã«è€æ°ã®åŒæ°ã«ãªãããã«åå²ããã°ãšã©ãŒãåºãªãããšããããšãèµ·ããããããªã£ãŠããããã ã
$ str="$(yes 'a' | head -131071 | tr -d '\n')"
$ /bin/echo "$str" | wc -c
131072
$ /bin/echo "x$str" | wc -c
bash: /bin/echo: Argument list too long
0
$ /bin/echo "$str$str" | wc -c
bash: /bin/echo: Argument list too long
0
$ /bin/echo "$str" "$str" | wc -c
262144
$ /bin/echo "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" | wc -c
1966080
$ /bin/echo "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" | wc -c
bash: /bin/echo: Argument list too long
0
$ cat /proc/version
Linux version 5.15.0-66-generic (buildd@lcy02-amd64-076) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #73-Ubuntu SMP Fri Feb 3 14:23:37 UTC 2023äžèšã®å®è¡çµæãèŠãŠãäœãèµ·ããŠããã®ãããçè§£ã§ããªãç¶æ ã®ãŸãŸæžç±ãWebäžããæ å ±ãéããããšãããšãäœèšã«æ··ä¹±ãããããããªããæè¿ã®Linuxã§ã®ããšã«ã€ããŠã¯ããŸãã¯äžèšçµæãçèªããããšãæšå¥šãããã
ãªããKnoppix 5.1.1ïŒ2007幎1æãªãªãŒã¹ãã«ãŒãã«2.6.19ïŒã®ãããªå€ãç°å¢ã§ã¯ãäžèšã®ããã«åŒæ°ãåå²ããã°ãšã©ãŒãåºã«ãããªããšãããããªããšã¯ãªãããããŸã§ãã³ãã³ãã©ã€ã³å šäœã®ãµã€ãºãéèŠã«ãªãã
ãŸã2023幎3ææç¹ã§ã¯ãLinux以å€ã®Unixå šè¬ã«ãããŠãã³ãã³ãã©ã€ã³å šäœã®ãµã€ãºãéèŠãªã®ã ãšèããŠããããã ã
å¶éãååšããŠãã以äžã¯æœåšçã«ã¯ALTLãªãŒããŒãããŒãåŒãèµ·ãããå¯èœæ§ããããããã©ã®OSãããå®å šããšãããããªæ¯èŒã¯ããŸãæå³ããªããã·ã§ã«ã¹ã¯ãªããã®å 容ã«ãã£ãŠãããå Žåã«ã¯æè¿ã®Linuxã®ã»ããæ»æãæåããããããã©ããå¥ã®å Žåã«ã¯æè¿ã®Linuxã®ã»ããæ»æãæåãã«ããããšããããšãèµ·ããã
ãšããã§ãæè¿ã®Linuxã§ã¯ãulimit -s 16384ãã®ããã«æ°åãæå®ã㊠ulimit ãå®è¡ãããšãglibcç°å¢ã§ã¯ãgetconf ARG_MAXãã®å€ã¯ãã£ãããšå€ãããã³ãã³ãã©ã€ã³å šäœã®é·ãå¶éãå€ããããã ã1ã€ã®åŒæ°ã®é·ãå¶éãå€ããããã§ã¯ãªãã
$ str="$(yes 'a' | head -131071 | tr -d '\n')"
$ /bin/echo "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" | wc -c
bash: /bin/echo: Argument list too long
0
$ ulimit -s
8192
$ getconf ARG_MAX
2097152
$ ulimit -s 16384
$ ulimit -s
16384
$ getconf ARG_MAX
4194304
$ /bin/echo "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" "$str" | wc -c
2097152
$ /bin/echo "x$str" | wc -c
bash: /bin/echo: Argument list too long
0
$ cat /proc/version
Linux version 5.15.0-66-generic (buildd@lcy02-amd64-076) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #73-Ubuntu SMP Fri Feb 3 14:23:37 UTC 2023Alpine Linux 3.17.1 Standard EditionïŒ2022幎ãªãªãŒã¹ïŒã®å Žåã¯ããulimit -s 16384ããå®è¡ããŠããgetconf ARG_MAXãã¯çžå€ããã 131072 ãåºåããã§ãã³ãã³ãã©ã€ã³å šäœã®é·ãå¶éã¯ç¢ºãã«å€ãã£ãŠããããšããç¶æ ã«ãªãã¯ãã§ããã
ã¡ãªã¿ã« ulimit ã¯ã·ã§ã«ã®ãã«ãã€ã³ïŒçµã¿èŸŒã¿ïŒã§ããã
ãšããã§ããã®ã»ã¯ã·ã§ã³ã§ã¯ãããŸã§ãã£ãš /bin/echo ã䜿ã£ãŠããã
åœç¶ãªããããã echo ã«å€æŽããã°ããã«ãã€ã³ã® echo ã䜿ãã®ã§ãããŠãã®ç°å¢ã§ã¯ãšã©ãŒãåºãªãããã«ãªãã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ echo "$str" | wc -c
1000000ãwc -cãã¯ãã€ãæ°ã®ã«ãŠã³ãã§ãããæ£åžžã«ãã®ãwc -cãã«ããŒã¿ãæž¡ããšãã€ãæ°ãã«ãŠã³ããããŠåºåããããããšã©ãŒã«ãªã£ãŠ wc ã«äœãããŒã¿ãæž¡ããªãã£ãå Žå㯠wc ã®åºå㯠0 ã«ãªã£ãŠããŸãããã ã
echo ããã«ãã€ã³ãã©ãã㯠type ã³ãã³ãã«ãã£ãŠç¢ºèªã§ããããªã zsh ã®ãã«ãã€ã³ã® which ãé€ããŠããããŠãã® which ã¯ã·ã§ã«ã®ãã«ãã€ã³ãã©ãããç¡èŠããŠéã£ãŠãããã¹ããæ¢ãããšããã
$ type echo
echo is a shell builtin
$ which echo
/usr/bin/echoã¡ãªã¿ã«ããããŠãã®ç°å¢ã§ã¯ã·ã§ã«ã®ãã«ãã€ã³ã®æ©èœã§ãã ${#str} ãšããæžãæ¹ã«ãã£ãŠæåæ°ãã«ãŠã³ãã§ããã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ echo "${#str}"
999999echo ã¯æ¹è¡ãä»å ããã®ã§ããecho "$str" | wc -cãã®çµæã¯ str ã®äžèº«ã®ãµã€ãºïŒã€ãŸã ${#str} ã®å±éåŸïŒããã1ãã€ãå€ããªãå Žåãããã
ãªãã${#str} ãšããæžãæ¹ã¯ãã€ãæ°ã§ã¯ãªãæåæ°ã®ã«ãŠã³ãã®ããããã«ããã€ãæåãããå Žåã¯ç°å¢å€æ°ã®åœ±é¿ãåãããããããªãã
$ echo $LANG
ja_JP.UTF-8
$ str_hiragana=$(printf '\343\201\202')
$ echo "$str_hiragana"
ã
$ echo "${#str_hiragana}"
1
$ LANG=C
$ echo "${#str_hiragana}"
3
$ echo $BASH_VERSION
5.1.16(1)-releaseããŠããã§ãgrep ã®çµäºã¹ããŒã¿ã¹ã«ã€ããŠèããŠã¿ããã
$ echo abc | grep z > /dev/null ; echo $?
1
$ echo abc | grep a > /dev/null ; echo $?
0èŠã€ãããªããã°1ãèŠã€ããã°0ã
ãããå©çšããŠãifæã§ã®æ¡ä»¶å€å®ãã&&ãã||ãã®ç絡è©äŸ¡ã䜿ããã
$ echo abc | grep z > /dev/null && echo 'FOUND!'
$ echo abc | grep a > /dev/null && echo 'FOUND!'
FOUND!ãã®äŸã§ã¯èŠã€ãããªããã°äœãåºåãããèŠã€ããã°ãFOUND!ããåºåããã
ã§ã¯ãå ã»ã©ã®ããã«ãArgument list too longããæå³çã«èµ·ããããã«ãããšã©ããªããã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ /bin/echo "$str" | grep a > /dev/null ; echo $?
bash: /bin/echo: Argument list too long
1çµäºã¹ããŒã¿ã¹ã¯ 1 ã«ãªã£ããåœç¶ã以äžã®ããã«ç絡è©äŸ¡ãå©çšããæããFOUND!ãã¯åºãªãã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ /bin/echo "$str" | grep a > /dev/null && echo 'FOUND!'
bash: /bin/echo: Argument list too longå·éã«èãããšæãããããšãèµ·ãã£ãŠãããããã¯ã€ãŸããã·ã§ã«å€æ° str ã«ã¯999999åãšãããã®ãããéã®ãaããå«ãŸããŠããã¯ãã ã£ãã«ãé¢ãããããgrep aãã«ããæ€åºã倱æããŠããã®ã§ããã
grep ã®çµäºã¹ããŒã¿ã¹ãäœããã®åœ¢ã§æ¡ä»¶å€å®ã«å©çšããŠããã³ãŒãã«ã¯ãåããã«ãããã°ãé ããŠãããããããªãããã ã
ãã¡ãããgrep ã«éããã ããšã©ãŒãåºãŠããã®ã¯ grep ã§ã¯ãªãããã®åã® /bin/echo ã®ãšããã§ããã
ãããŠãçµäºã¹ããŒã¿ã¹ã ãã§ãªãåºåãåé¡ã«ãªãããšããããäŸãã°ä»£å ¥æã ã以äžã®äŸã§ã¯å€æ° pickup ãžã®ä»£å ¥ã倱æããpickup ã空æååã«ãªã£ãŠããŸã£ãŠããã
$ str="$(yes 'abc' | head -999999 | tr -d '\n')"
$ pickup="$(/bin/echo "$str" | tr -dc a)"
bash: /bin/echo: Argument list too long
$ echo "$pickup"
$ echo "${#pickup}"
0ã¡ãªã¿ã« /bin/echo ã®å®è¡ãã§ããã«ãArgument list too longãã®ãšã©ãŒãåºãå Žåããã® /bin/echo ã®çµäºã¹ããŒã¿ã¹ã¯OSããšã«éãããããŠã㯠126 ã«ãªãããšãæåŸ ã§ããã
以äžã¯Lubuntu 22.04.1ïŒ2022幎ãªãªãŒã¹ïŒã®å Žåãbash ãš dashïŒ/bin/shïŒäž¡æ¹ã§è©ŠããŠããã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ /bin/echo "$str" > /dev/null
bash: /bin/echo: Argument list too long
$ echo $?
126
$ echo $BASH_VERSION
5.1.16(1)-release
$ /bin/sh
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ /bin/echo "$str" > /dev/null
/bin/sh: 2: /bin/echo: Argument list too long
$ echo $?
126
$ cat /proc/version
Linux version 5.15.0-66-generic (buildd@lcy02-amd64-076) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #73-Ubuntu SMP Fri Feb 3 14:23:37 UTC 2023OpenBSD 7.2ïŒ2022幎10æãªãªãŒã¹ïŒã® /bin/sh ã§ã¯ 126 ã§ã¯ãªã 1 ã«ãªããããããªãã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ /bin/echo "$str" > /dev/null
/bin/sh: /bin/echo: Argument list too long
$ echo $?
1
$ uname -a
OpenBSD vm1.localdomain 7.2 GENERIC#728 amd64Zsh ã§ã¯ 127 ã«ãªããããããªãã
ãããã«ãããããã㯠/bin/echo ã®åºåããã€ãã§ grep ã«æž¡ããããšã¯ grep ã®çµäºã¹ããŒã¿ã¹ãéèŠã«ãªãã
çµå±ã®ãšããããçããšãåœããšããéåžžã«åºæ¬çãã€æ ¹æ¬çãªéšåã«ãããŠãã·ã§ã«ã¹ã¯ãªããã®å Žåã¯æ éã«ãªããããããªãã®ã§ããã
ãšããã§ã./configure ã¹ã¯ãªãããèªåçæããGNU AutoconfãšããããŒã«ãããããã®GNU Autoconfã®ããã¥ã¡ã³ãã®äžã«ã·ã§ã«ã¹ã¯ãªããã®ç§»æ€æ§ïŒäºææ§ïŒã«ã€ããŠã®è§£èª¬ããã£ãŠããããªããªãã«å 容ãå å®ããŠããŠé¢çœãã®ã ããããã® true ã³ãã³ãã«ã€ããŠã®èšè¿°ãå³ããæ·±ãã
å¿é ããªãã§ãã ããïŒæã ãç¥ã£ãŠããéãtrueã«ã¯ç§»æ€æ§ããã ãŸãïŒããã«ããããããïŒåžžã«çµã¿èŸŒã¿ã³ãã³ããšããããã§ã¯ãªã(äŸãã° Bash 1.x)ïŒç§»æ€æ§ã®é«ãã·ã§ã«ã®ã³ãã¥ããã£ã¯ïŒ:ã®äœ¿çšã奜ã¿ã ã¡ã§ãïŒããã«ã¯å¯äœçšããããŸãïŒfalseãtrueããç§» æ€æ§ãé«ããã©ããå°ããŠã¿ããšãã®Alexandre Oliva ã®åçã§ãïŒ
ããããååšããªãå ŽåïŒã·ã§ã«ã¯ïŒfalseã«å¯ŸããŠã¯æ£ããïŒ trueã«å¯ŸããŠã¯æ£ãããªãïŒç°åžžçµäºã®ã¹ããŒã¿ã¹ãçæããã®ã§ïŒ ããæå³ã§ã¯ãã®ãšããã§ãïŒ
ãã®ç®æã¯ä»¥äžã®URLã§ç¢ºèªã§ããã
Autoconf: 10. ç§»æ€æ§ã®ããã·ã§ã«ããã°ã©ãã³ã°
https://web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html#IDX852
åæã¯ä»¥äžã®éãã§ããã
Donât worry: as far as we know true is portable. Nevertheless, itâs not always a builtin (e.g., Bash 1.x), and the portable shell community tends to prefer using :. This has a funny side effect: when asked whether false is more portable than true Alexandre Oliva answered:
In a sense, yes, because if it doesnât exist, the shell will produce an exit status of failure, which is correct for false, but not for true.
åæã«ã€ããŠã¯ãäŸãã°ä»¥äžã®URLã§ç¢ºèªã§ããã
GNU Autoconf 2.71 manual (28 January 2021)
https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.71/autoconf.html#index-true
2012幎ã®åŸåã ã£ãã2013幎ã®ååã ã£ãããçè ã¯ãã®ç®æãèªãã æã«ç°æ§ãªæèŠã®äžã«åŒããã蟌ãŸããã
ãŸããã® true ã³ãã³ããš false ã³ãã³ãã®é察称æ§ã®è©±é¡ã匷ãå°è±¡ã«æ®ã£ãŠããããããããArgument list too longããšãããšã©ãŒã®è©³çްãç¥ã£ãæã«äœã宿åœçãªãã®ãæããããšããããã§ããã
åã®ã»ã¯ã·ã§ã³ãæ ¹æ¬åçã«ã€ããŠãã®äžã§ãã·ã§ã«ã¹ã¯ãªããã«è©³ãã人ã ã£ãããtrue ãš false ã¯å¯Ÿçã§ã¯ãªãããšããæç« ã ãã§ã倧ããªãã³ãã«ãªããšè¿°ã¹ãã®ã¯ãã·ã§ã«ã¹ã¯ãªããã«ãããå ç¢æ§ã«ã€ããŠãã£ããèããŠããææããã人ã§ããã°ã©ããã§ãããã£ã話é¡ãšåºäŒã£ãããšãããã®ã§ã¯ãªãããšæã£ãããã§ããã
ã¡ãªã¿ã«äžèšã®ããã¥ã¡ã³ããfalse ã³ãã³ãã®ãšããã«ã¯Solarisã® /bin/false ã®çµäºã¹ããŒã¿ã¹ã¯ 1 ã§ã¯ãªã 255 ã ãšæžãããŠãããããã¯ããã§è¡æçã«æãã人ããããããããªããå®éã«ç¢ºèªããŠã¿ããšSolaris 11.4ïŒ2018幎ãªãªãŒã¹ïŒã§ç¢ºãã«ãããªãã
$ /bin/false
$ echo $?
255
$ uname -a
SunOS solaris 5.11 11.4.0.15.0 i86pc i386 i86pcOpenIndiana 2022.10ïŒ2022幎ãªãªãŒã¹ïŒã§ããããªãã
$ /bin/false
$ echo $?
255
$ uname -a
SunOS vm1 5.11 illumos-b8af4a8966 i86pc i386 i86pcãªãããã®ããã¥ã¡ã³ãã® web.sfc.wide.ad.jp ã«ããéŠèš³ã«ã€ããŠã¯ã2023幎3ææç¹ã§ç¢ºèªã§ããéãã¯å€ãããŒãžã§ã³ïŒ2.59ïŒã®ãã®ã®ç¿»èš³ãããªãããšã«æ³šæããå¿ èŠããããAutoconf 2.59ãšããã®ã¯ããœãããŠã§ã¢ã®ãªãªãŒã¹ãšããŠã¯2003幎12æã§ãã20幎è¿ããåã«ãªãã
äŸãã° $(commands) ãšããæžãæ¹ã«ã€ããŠãéŠèš³ïŒããŒãžã§ã³2.59ïŒã®ã»ãã§ã¯ãæ®å¿µãªããïŒãŸã å šäœçã«ãµããŒããããŠããŸããïŒãïŒåæã§ã¯ãUnfortunately it is not yet widely supported.ãïŒãšããããããŒãžã§ã³2.71ã®è±èªã®ããã¥ã¡ã³ãã®ã»ãã§ã¯ãAlthough it is almost universally supported, unfortunately ...ãïŒã»ãŒäŸå€ãªããµããŒããããŠã¯ãããã®ã®ãæ®å¿µãªããâŠïŒãšè¡šçŸãå€ãã£ãŠããã
該åœç®æã¯ãããã以äžã®URLã
çè ããã®èšäºãå·çããŠãã2023幎3ææç¹ã§ã¯ããŒãžã§ã³2.71ã®ããã¥ã¡ã³ããææ°ã ãã以äžã®URLãããã£ãšæ°ãããã®ãå ¥æã§ãããããããªãã
GNU Autoconf - Creating Automatic Configuration Scripts - GNU Project
https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/
ãªããããŒãžã§ã³2.59ã®é ã®è±èªã®åæã¯ä»¥äžã§èªããã
Autoconf: Table of Contents - GNU Project - Free Software Foundation (FSF)
https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.59/
ãšããã§ãããã§äººéå士ã®å¶ã¿ãšãããã®ã«ç®ãç§»ããŠã¿ããã
人éå士ã®å ŽåããYESãšNOã¯å¯Ÿçã§ã¯ãªãããšããããšãããããã
ãããã£ãèšãæ¹ã¯ãéåžžã¯äœããã®æå³ã§ã®åé¢ä¿ã®å·®ãæèãããŠããããšãå€ãã
ããšãåé¢ä¿ã®å·®ã®ãããªãã®ãã»ãšãã©é¢ä¿ãªããããªå Žé¢ã§ãã£ããšããŠããäŸãã°äœããã®ç²ãåã£ã人éã®éå£ãåã«ããŠããã®éå£ã®äžããæ©ãã人ã ããæœåºãããããšèããæã«ãäžäººäžäººã«å¯ŸããŠç©ççã«å£é ã§åããããããŠãã£ãŠæç¢ºã«ãæ©ããŸããããšåçããã£ã人以å€ã¯å šå¡æ©ããã¯ãã ãšæ¬æ°ã§èããã®ã¯éŠ¬é¹¿ããŠããã
æ°çµ¶ããŠãããããã°äœãåçã§ããªãå¯èœæ§ããããããã®å Žã«ããªãïŒã€ãŸããååšããªããïŒå Žåã¯åçãç©ççã«äžå¯èœã§ããããŸããåãããããšããè¡çºèªäœãéäžã§å€±æããããã«ãäœãåããããããªãã£ãããšèªèããŠããŸãå Žåããããããããªãã
èäœãšããå®äœããããããããã¯åœç¶ã®ããšã ã
çŽç²ã«è«ççãªäžçã«ããããçããšãåœããã³ã³ãã¥ãŒã¿ã®äžçã§è¡šçŸããããšããéã«ã¯ããã®ãçããšãåœãã¯äœããã®åœ¢ã§å®äœãæã€ããšã«ãªãã
è«ççãªäžçãšçŸå®äžçã®ã®ã£ãããããçããšãåœããšããæãæ ¹æ¬çãªéšåã«ãããŠéãç«ã¡çŸããŠããã®ã§ããã
ã
ã·ã§ã«ã¹ã¯ãªããã«ãããçŸå®çãªæ³šæç¹
ã·ã§ã«ã¹ã¯ãªããããããŸã§ãã¹ã¯ãªããèšèªã®äžã€ãšããŠã¿ãªããŠãã³ãŒãã£ã³ã°ã«ãããçŸå®çãªæ³šæç¹ãè¿°ã¹ãŠããããããã ãç¶²çŸ çãªãã®ã§ã¯ãªãããšã«æ³šæããŠã»ããã
ãŸããset -eãã¯ããŠã«ãªããªããããã«ã€ããŠã¯GNU Autoconfã®ããã¥ã¡ã³ããåç §ã
該åœç®æã¯ä»¥äžã®URLã
https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.71/autoconf.html#index-set
ïŒweb.sfc.wide.ad.jp ã«ããéŠèš³ã®ã»ãã¯å€ãããŒãžã§ã³ã®ç¿»èš³ãªã®ã§ããset -eãã®è©³çްã«ã€ããŠã®ç®æã¯ãªãããšã«æ³šæïŒ
ãŸããFreeBSDã®manããŒãžã§ã巚倧ãªã¹ã¯ãªããã§ã¯ -e ã«äŸåããªãããæšå¥šãããŠããã
Bashéå®ãšããããšãªããSIGPIPE ããããã圱é¿ã«æ°ãã€ããŠããã°ãset -eãããset -o pipefailãã¯ãããªãã«æçšãããããªããããã«ã€ããŠã¯æ¬¡ã®ã»ã¯ã·ã§ã³ãBashéå®ã®è©±é¡ãã§åŸè¿°ããã
å®éã«ã¯2023幎3æçŸåšã®æ®µéã§ã¯ããset -eãã¯ããå°ãããŠã«ããŠãããååšãªã®ãããããããBashéå®ããšããèšãæ¹ã¯çãèšå®ããããªã®ãããããªããããšãããããã®èšäºã§ã¯ãBashéå®ããšããèšãæ¹ãããã
ãªããããã§ãset -eãããããŠã«ãªããªãããšããæãã·ã§ã«ã«ãã£ãŠå®è£ ããŸã¡ãŸã¡ã§ç§»æ€æ§ïŒäºææ§ïŒã®èгç¹ããããŠã«ãªããªããšããããšãšãALTLãªãŒããŒãããŒã«ãããŠã¯ifæãªã©ã®æ¡ä»¶å€å®ãç絡è©äŸ¡ãéèŠã ããããŠã«ã§ããªããšããããšã2ã€ã®åŽé¢ãããã
ãset -eãã¯ã·ã§ã«ã®èšèªãšããŠã®æ§è³ªäžãifæãªã©ã®æ¡ä»¶å€å®ãç絡è©äŸ¡ã®å·ŠåŽã§ã¯çºåããªããããã«ã€ããŠã¯ãã·ã§ã«ã¹ã¯ãªãã以å€ã®èšèªã«ãããALTLãªãŒããŒãããŒãã®ã»ã¯ã·ã§ã³ã§åŸè¿°ããã
ããŠãset ã«é Œããã«å ç¢ã«ããããã«ã¯ãäœããããŸãã¯ã·ã§ã«å€æ°ã®äœ¿çšãã®ãã®ãæžããããšãã§ããªããèããŠã¿ãã»ããè¯ãããã ã
ããããã³ãã³ãã«åŒæ°ãæž¡ãæ©äŒããªããã°ããArgument list too longãã®ãšã©ãŒã¯èµ·ãããªãã®ã§ããã
èªåã®ã¹ã¯ãªããã¯ãªãã¹ããã£ã«ã¿ããã°ã©ã ã«ãããšããã®ã1ã€ã®æ¹æ³ã ã
åé ã®åºé¡ã®å Žåãã¹ã¯ãªãããåå²ã㊠cdwdoc-2023-001_challenge2.sh ãçšæããŠããããã ããåå²ããã®ãªãçæ¹ã¯çŽç²ãªãã£ã«ã¿ãäŸãã°ãã¹ã¯ãŒããæšæºå ¥åããåãåã£ãŠãµã å€ãæšæºåºåã«åºåããã ãã®ãããªãã®ã§ãè¯ãããã§ããã
ãã®ãã£ã«ã¿ããã°ã©ã ã®åºåçµæã«ã€ããŠã¯å€æ°ã«å ¥ããŠãããã®ãããããªããããšã¯ãã«ãã€ã³ïŒçµã¿èŸŒã¿ïŒã® test ïŒããã㯠[ ... ] ïŒã§äœ¿ãã ããªã®ã§ããã°ã
ãŸãã倿°ã®åçŽãªåºåã«ã€ããŠãèããå¿ èŠãããããã ããã£ã«ã¿ã«ããã«ããŠãããã€ãã©ã€ã³ã®èµ·ç¹ã§å€æ°ã®åºåãããããšããå Žé¢ã¯å€ããã ã
ã€ãŸãã/bin/echo ã¯ãããããšããããšã§ããã
ã§ãæ£çŽãªãšãããã©ããªå Žåã§ã /bin/echo ãæé€ã§ããã®ãã©ããã¯çè ã«ã¯ããåãããªããmacOSã§ã¯ /bin/echo ã䜿ãã¹ãã ãšèãã人ããããè·å Žã®ã³ãŒãã£ã³ã°èŠçŽããããžã§ã¯ãã®æŽå²çäºæ ãªã©ã§ /bin/echo ã®äœ¿çšã匷å¶ãããããšããããããããªãã
ããå¯èœãªã®ã§ããã°ãecho ã®ä»£ããã« printf ã§ä»£æ¿ã§ããªãããšããã®ãæ€èšããã®ããããããããªãã
ãã ã printf ãå©çšããã³ãŒãããããšãçŸæç¹ã§ã¯å®ç§ã«èŠãããããªãã®ã§ãã£ããšããŠããããããããå°æ¥çã«æ§ã ãªãšããžã±ãŒã¹ã«å¯Ÿå¿ããããã®ã³ãŒããè²ããªäººã«ãã£ãŠã¬ã³ã¬ã³è¿œå ãããŠãããã¡ã«ãã€ã®éã«ããã®ãããžã§ã¯ãã§ã¯ãprintfãã¯ã·ã§ã«é¢æ°ã«ãªã£ãŠããŠããã®é¢æ°å ã§ã¯ç¹å®ã®ãã¿ãŒã³ã®æã ããã«ãã€ã³ïŒçµã¿èŸŒã¿ïŒã§ãªãã³ãã³ããåŒã¶ããã«ãªã£ãŠããâŠâŠãšãããããªå¯èœæ§ãããããªãã¯ãªãã
ä»ã«ããalias ã³ãã³ãã§ãã£ãããbash ã zsh ã«ã¯ãã«ãã€ã³ã³ãã³ãã®ç¡å¹åãããããšãã§ãã enable ã³ãã³ãã®ãããªãã®ããããããããã¯ãã³ãŒãã®äžã®ãprintfãã®æå³ãå°æ¥çã«å€æŽãããèŠå ã«ãªãã
ãŸããOpenBSDã® /bin/sh 㯠pdksh ã§ãprintf ããã«ãã€ã³ã§ã¯ãªãã åããOpenBSDãããã©ãŒã¯ããMirBSDã® /bin/sh 㯠mksh ãšããã·ã§ã«ã§ããã¯ã printf ããã«ãã€ã³ã§ã¯ãªãã
以äžã¯OpenBSD 7.2ïŒ2022幎10æãªãªãŒã¹ïŒã§ç¢ºèªãããã®ã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ printf "$str" | wc -c
/bin/sh: printf: Argument list too long
0
$ type printf
printf is /usr/bin/printf
$ uname -a
OpenBSD vm1.localdomain 7.2 GENERIC#728 amd64ç§»æ€æ§ïŒäºææ§ïŒãèæ ®ãã€ã€å°æ¥çã«æå³ãå€ããã«ãããã®ãæåãããªããã<<ããå©çšãããã¢ããã¥ã¡ã³ãïŒhere documentsïŒãããããã ãè€æ°è¡ã«ãªãã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ /bin/echo "$str" | wc -c
bash: /bin/echo: Argument list too long
0
$ wc -c <<EOS
> $str
> EOS
1000000ãã€ãã§ã€ãªãããšããŠå¥åŠãªã³ãŒãã«ãªãããšããããããããªãã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ { wc -c | sed 's/^[^0-9]*/_/' ; } <<EOS
> $str
> EOS
_1000000æžãããšæãã°ã°ã«ãŒãã³ã°ã§æžããããšããããšãç¥ã£ãŠããã®ã¯å®å¿ææã«ã¯ãªããããããªãã
ãã¢ããã¥ã¡ã³ãã®ç§»æ€æ§ã®æ³šæç¹ã«ã€ããŠã¯ãGNU Autoconfã®ããã¥ã¡ã³ããèŠç¢ºèªã§ããã
該åœç®æã¯ãããã以äžã®URLãéŠèš³ã®ã»ãã¯å€ãã®ã§æ å ±ãå°ãªãããšã«æ³šæã
ã¡ãªã¿ã«ãããã«ã¹ã¯ã©ãããã1æ¥ã§CMSãäœã ã·ã§ã«ã¹ã¯ãªããé«ééçºææ³å ¥éããšããæ¬ïŒç¬¬1çã¯2014幎åããªãçè ã¯ç¬¬2çã«ã€ããŠã¯æªèŠïŒã®ç¬¬4ç« ã® index.2.cgi ã§ã¯ã以äžã®ãããªæååã®ç¡å®³åïŒãµãã¿ã€ãºïŒã®ç®æãããã
page=$(tr -dc 'a-zA-Z0-9_' <<< "${QUERY_STRING:2}")
GitHub.com äžã«çœ®ãããŠããæžç±ãµã³ãã«ã³ãŒãã§ã¯ã以äžã®ç®æã§ããã
https://github.com/ryuichiueda/BashCMSBookCodes/blob/81eb97c4a40eb304365f8db40b1a07acc9ab11f3/bashcms.remote.chap4/index.2.cgi#L6
ãŸãindex.3.cgiããã³ãã以éã§ãããã®æžãæ¹ãèžè¥²ãããŠããããã ã
ãã®æžãæ¹ã¯ããset -eããããŠããªãå Žåã§ãã£ãŠãããããå®å šã§ããã
ã<<<ãã¯ãã¢ã¹ããªã³ã°ïŒhere stringsïŒãšãããã®ã§ãããããã¢æååããšèš³ãããããšããããBashã®ããã¥ã¢ã«ã§ã¯ããã¢ããã¥ã¡ã³ãã®äžçš®ãïŒA variant of here documentsïŒãšèª¬æãããŠãããbash ã ksh93 ã«ãããŠã¯ãã<<<ãã䜿ããªããArgument list too longãã®ãšã©ãŒã¯åºãªããããã€ãã§ã€ãªãã§ããæã«ãåãããããã³ãŒãã«ãªãã
çè ã«ãšã£ãŠã¯ééããææããããšããããå®å šå®£èšãã®ã»ããã¯ããã«ç·åŒµããããããã§ãå®å šããšããèšèã䜿ãã®ã¯ä»ã«ãçç±ãããã
ãã®ç®æã¯ifæã®æ¡ä»¶å€å®ã®äžãªã©ã§ã¯ãªã倿° page ãžã®ä»£å ¥ã§ãããªããããããä»®ã«ããã§äœãäºæ³ã ã«ããªããããªãšã©ãŒãåºããšããŠã page ã空æååã«ãªãã ãã®å¯èœæ§ãé«ãã®ã ããããŠçŽåŸã« page ã空æååã ã£ãå Žåã®ãpage=topãã®åæåãããã®ã§ãåºæ¬çã«ã¯ãšã©ãŒãèµ·ãã£ãããtopããšããæååã§åæåãããã¯ãã ãšæåŸ ããŠããããšã«ãªãã
ä»£å ¥ã§ããã°ãã€ã§ãã©ããªæã§ãå®å šãšããããã§ã¯ãªãããã®æ¬ã®ãã®ç®æã®æžãæ¹ã§ããã°å®å šããšããã ãã§ããã
äŸãã°ãããã tr ã³ãã³ãã®ãªãã·ã§ã³ãã-dcãã§ã¯ãªãã-dãã§ã䜿çšäžå¯ãªæåã ããæœåºããããã«ãtr -d 'a-zA-Z0-9_'ããšãããããªæžãæ¹ãããŠããŠãã<<<ãã§ã¯ãªã /bin/echo ã䜿ã£ãŠãããšãŸããå Žåããããããããªããä»£å ¥ã®ç®æã§ããããšãå®éã«ã¯å±éºãªæåãå«ãŸããŠããã«ãé¢ããããå±éºãªæåãååšããªãã£ãããã«èŠããŠããŸãã
以äžã¯ãå±éºãªæåãæœåºã§ããŠããå Žåã
$ str='aaaaaaaaaa!"#$%&'
$ echo "${#str}"
16
$ danger=$(/bin/echo "$str" | tr -d 'a-zA-Z0-9_')
$ echo "$danger"
!"#$%&
$ echo "${#danger}"
6以äžã¯ãå±éºãªæåãããŸãæœåºã§ããŠããªãå Žåã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"'!"#$%&'
$ echo "${#str}"
1000005
$ danger=$(/bin/echo "$str" | tr -d 'a-zA-Z0-9_')
bash: /bin/echo: Argument list too long
$ echo "$danger"
$ echo "${#danger}"
0ãã®å Žåã倿° danger ã空æååãã©ããã«ãã£ãŠå®å šãã©ãããå€å®ããããšãããšããŸããããšã«ãªãããã ã
ããšãBashã§ãã£ãŠãããã¯ãset -uãã§ã¯æ€åºã§ããªãããã ãBashãZshã«ã¯ãset -o pipefailãããããããã§æ€åºããããšã¯å¯èœã§ãããããã¯æ¬¡ã®ã»ã¯ã·ã§ã³ãBashéå®ã®è©±é¡ãã§åŸè¿°ããã
ã¡ãªã¿ã«ãã¢ã¹ããªã³ã°ïŒhere stringsïŒã®ã<<<ãã«ã€ããŠã¯ãBashã§ãªã以äžã®ãããªç¡è¶ãªããŒã¿éã§ãç¹ã«åé¡ãªãã
$ str="$(yes 'a-' | head -99999999 | tr -d '\n')"
$ wc -c <<< "$str"
199999999
$ tr -dc a-z <<< "$str" | wc -c
99999999
$ echo $BASH_VERSION
5.1.16(1)-releaseksh93ïŒksh93u+mïŒã§ãã<<<ãã¯å€§äžå€«ã
$ ksh
$ str="$(yes 'a-' | head -99999999 | tr -d '\n')"
yes: standard output: Connection reset by peer
$ wc -c <<< "$str"
199999999
$ tr -dc a-z <<< "$str" | wc -c
99999999
$ echo $KSH_VERSION
Version AJM 93u+m/1.0.0-beta.2 2021-12-17å·šå€§ãªæååçæã®ãšããã§ãyes 'a-' 2> /dev/null | ...ãã®ããã«ããŠãããªããšãConnection reset by peerããšãããšã©ãŒã¡ãã»ãŒãžããããããããªããããã㯠SIGPIPE ã·ã°ãã«ã«ãããã®ã§ããã
ãã¡ãããZshã«ãã<<<ãã¯ããã
ãŸããSolaris 11.4ïŒ2018幎ãªãªãŒã¹ïŒãOpenIndiana 2022.10ïŒ2022幎ãªãªãŒã¹ïŒã® /bin/sh ã«ãã<<<ãã¯ããã
$ wc -c <<< aaa
4
$ uname -a
SunOS solaris 5.11 11.4.0.15.0 i86pc i386 i86pcã¡ãªã¿ã«dashã ãšã<<<ãã¯äœ¿ããªãã
$ dash
$ wc -c <<< aaa
dash: 1: Syntax error: redirection unexpectedBusyBox shãã<<<ãã¯äœ¿ããªãã
$ busybox sh
BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ $ wc -c <<< aaa
sh: syntax error: unexpected redirectionOpenBSD 7.2ïŒ2022幎10æãªãªãŒã¹ïŒã® /bin/shïŒpdkshïŒãã<<<ãã¯äœ¿ããªãã
$ wc -c <<< aaa
/bin/sh: syntax error: `< ' unexpected
$ uname -a
OpenBSD vm1.localdomain 7.2 GENERIC#728 amd64FreeBSD 13.1-RELEASEïŒ2022幎ãªãªãŒã¹ïŒã® /bin/shãGhostBSD 22.06.18ïŒ2022幎ãªãªãŒã¹ïŒã® /bin/shãNetBSD 9.3ïŒ2022幎ãªãªãŒã¹ïŒã® /bin/shãDragonFly BSD 6.4.0ïŒ2023幎ãªãªãŒã¹ïŒã® /bin/sh ãªã©ã§ãã<<<ãã¯äœ¿ããªãã
ã¡ãªã¿ã«BashãZshã§ãset -o pipefailããããŠããæã¯ããããã¢ã¹ããªã³ã°ïŒã<<<ãïŒã®äŸ¡å€ã¯é«ãŸããããããªããããã¯æ¬¡ã®ã»ã¯ã·ã§ã³ãBashéå®ã®è©±é¡ãã§åŸè¿°ããã
ã<<ããã<<<ããªã©ã®ãã¢ããã¥ã¡ã³ãã®é¡ã䜿ããšããã®ã¯ãArgument list too longãã®ãããªãšã©ãŒãèµ·ãããªããšããçºæ³ã ãããããããã®ãšã¯å¥ã®ãã¯ãã«ã®è©±ãšããŠããããã£ããšã©ãŒãèµ·ãã£ããšããŠãå®å šã§ããããã«ã¯ã§ããªããã®ãªã®ã ãããã
å ã»ã©ã¯å€æ°ãžã®ä»£å ¥ã§ãããªãããã«ä»®ã«ãšã©ãŒã«ãªã£ãŠã倧ããªåé¡ã«ãªããªããšè¿°ã¹ããããããã£ãããšä»¥å€ã§æ³šç®ãããã®ã¯åæåã®ããæ¹ã«ã€ããŠã§ããã
åé ã®åºé¡ã«ãããã³ãŒãã§ã¯ããŸãåæåã®æ®µéã§ãå®å šåŽã«åãããšããããšããã£ãŠããªãã
cdwdoc-2023-001_challenge.shïŒ https://gitlab.com/-/snippets/2494925 ïŒã«ã¯ã以äžã®ãããªåæåã®ã³ãŒããããã
user_is_valid=1ãã®ããšã«ãæ£åœãªãŠãŒã¶ãŒã§ã¯ããªãããšããããšã確å®ã«ãªã£ãŠãããuser_is_valid=0ããšããŠããã
ããã§ã¯ãªãããŸã以äžã®ããã«åæåãããŠãããã»ããããã£ãã®ã§ã¯ãªãã ãããã
user_is_valid=0ãããŠãã®ããšã«ã絶察ã«ããã絶察ã«ããã®äººã¯ééããªãæ£èŠã®ãŠãŒã¶ãŒã ããããšããããšã確å®ã«ãªã£ã段éã§ã¯ãããŠãuser_is_valid=1ããšããã»ããããã®ã§ã¯ãªãã ãããã
ååããŸããã®ã ãæåããããããæ¹éã§ã³ãŒããæžãå§ããŠããã°ãæ£èŠã®ãŠãŒã¶ãŒãã©ããã®æ¡ä»¶å€å®ã®ãšããã§ãArgument list too longããåºããšããŠãifæã®äžã«å ¥ããªããããæ£èŠã®ãŠãŒã¶ãŒãšèª€èªããããšã¯ãªãã
ããšãããã°ã©ããŒããArgument list too longãã®ãšã©ãŒãç¥ããªãã£ããšããŠãã倧ããªåé¡ãšã¯ãªããªãã£ããããããªãã®ã§ããã
ããããããšã«ã€ããŠã¯ãéçè§£æããŒã«ã¯ææããŠãããªããããããªãã
ãã®ããšã«é¢é£ããŠãã³ã³ãã¥ãŒã¿ã®äžã§ã®ããšã§ã¯ãªãã人éãæ©åšã䜿ã£ãŠå€å®ãããããªç¶æ³ã«ã€ããŠèããŠã¿ããã
äŸãã°ãäœæž©ã37.5â以äžã®äººã絶察ã«å»ºç©ã®äžã«å ¥ããããªããšãããããªå Žåã
ãã®æãã37.5â以äžã衚瀺ããããããã®äººã¯å»ºç©ã®äžã«å ¥ããªãããã«ããŠãã ããããšããæç€ºã«ã¯ææ§ããããããšã«ãªããããã37.5â以äžã®äººã絶察ã«å»ºç©ã®äžã«å ¥ããããªãããšããã®ãæåªå ã®æ¹éã§ãããªãã°ãå®éã®æç¶ãã¯ã37.4âãããã¯ãã以äžã衚瀺ãããå Žåã®ã¿ããã®äººã建ç©ã®äžã«å ¥ããããšãããããªãã®ã«ãªãã¯ããªã®ã ããªããªãã°ãäœæž©ã枬å®ããæ©åšãæ éããŠäœã衚瀺ããªããªããããããªãããã ã
ã·ã§ã«ã¹ã¯ãªããã«ãããŠã¯ãããšãæªç¥ã®ãšã©ãŒãåºããšããŠãå®å šãªã³ãŒãã«ãªãããã«ããæ¹æ³ã¯ä»ã«ãããã
ããã§ãåæåããããæ¹é以å€ã«ãã¬ãŒãç¯ãïŒguard clauseïŒãšã®é¢ä¿ã«ã€ããŠãèããŠã¿ããã
ã¬ãŒãç¯ãšã¯ãäŸå€çç¶æ³ã ã£ãå Žåã¯é¢æ°ã®åé ãªã©ã§ãã£ããšæããããã®ãã®ã ããã¢ãŒãªãŒã»ãªã¿ãŒã³ãïŒearly returnïŒããæ©æãªã¿ãŒã³ããšããèšãæ¹ããããããšãããã
æšä»ã§ã¯å®æçãªèå žãšããŠåŽããããããšããããããããªãŒããã«ã³ãŒãããšããæ¬ïŒéŠèš³ãåèã2012幎åïŒã§ã¯ã7.5 颿°ããæ©ãè¿ãããã7.7 ãã¹ããæµ ããããã®ã»ã¯ã·ã§ã³ã§ããã®ã¬ãŒãç¯ã«ã€ããŠè§£èª¬ãããŠããããŸããã¬ãŒãç¯ãšã¯ãããã¥ã¢ã³ã¹ãéããã®ãšããŠã颿°ããæ©ãã«æããããšã«ãã£ãŠããžãã¯å šäœã®èŠéããããããäŸãšããŠã8.5 äŸ: è€éãªããžãã¯ãšæ Œéãããã®ã»ã¯ã·ã§ã³ã«è峿·±ãäŸãèŒã£ãŠããã
ãã®ã¬ãŒãç¯ãšãããã®ã¯éåžžãåé ã§äœããã®åœ¢ã§æ¡ä»¶å€å®ãããã
if ...(some check)... ; then
return 1
fi
...(some sort of sensitive process)...ã·ã§ã«ã¹ã¯ãªããã®å Žåã¯ãäžèšã®ãããªæžãæ¹ã¯æœåšçã«ã¯ãã¹ãŠå±ãããšããããšã«ãªãããªããªãã...(some check)...ãã®ç®æã§ãšã©ãŒãèµ·ãã£ãå Žåãåé ã§æããã¯ãã®ãã®ãæããã«ãã®ãŸãŸæ¬äœã®ã»ãã«åŠçãé²ãã§ããŸãã®ã§ããã
å®éã«åãã³ãŒãã§ç€ºããã
cdwdoc-2023-001_sample_dir.sh ( https://gitlab.com/-/snippets/2487375 )
#!/bin/sh
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
# too optimistic guard clause
if /bin/echo "x$1$2$3" | grep '[^a-z0-9/]' > /dev/null ; then
echo "error: invalid dir"
exit 1
fi
user_name="$1"
dir="$2"
option="$3"
realpath "/home/$user_name/$dir"
exit 0éåžžã¯ãã®ã¹ã¯ãªããã¯ã/home/ãã§å§ãŸãæååãåºåããããALTLãªãŒããŒãããŒãå©çšãããšãã®ã¹ã¯ãªããã«ã/rootããšããæååãåºåãããããšãã§ããã
ãªãããã®ã¹ã¯ãªããã¯åºæ¬çã«ã¯æè¿ã®Linuxéå®ã®ãã®ã ãã«ãŒãã«2.6.23ããã³ãã以éãåæã§ããããŸãã/usr/bin/realpath ã¯GNU coreutilsã®ãã®ã§ãããããããã¯æè¿ã®busyboxãžã®symlinkã«ãªã£ãŠããå¿ èŠããããæè¿ã®busyboxãšãããããæè¿ã®glibcã«ãªã³ã¯ããŠããbusyboxãšèšãã¹ããããããªãã
ããããããã§ãäŸãã°Alpine Linux 3.17.1 Standard EditionïŒ2022幎ãªãªãŒã¹ïŒã§ã¯çè ãæå³ããããã«ã¯åäœããªãã
以äžã®ããã«ãrealpath ãå·šå€§ãªæååãåãåã£ãŠãåŸåã«è§£éããã®ãåæã§ããã
$ str="$(yes '../' | head -43684 | tr -d '\n')"
$ wc -c <<< "${str}root"
131057
$ realpath "${str}root"
/root
$ realpath --version
realpath (GNU coreutils) 8.32
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Padraig Brady.Knoppix 7.2.0ïŒKNOPPIX_V7.2.0CD-2013-06-16-EN.isoã2013幎ãªãªãŒã¹ãã«ãŒãã«3.9.6ãGNU coreutilsã¯8.13ïŒã®å Žåã§ã¯ãæåã«ãŸã以äžã®ããã«ã㊠/usr/bin/realpath ãäœæããŠããå¿ èŠããããããããªãã
$ sudo ln -s /bin/busybox /usr/bin/realpathãŸãããã®ããã«ããŠãKnoppix 7.2.0ã®å Žåã¯æ»ææåæã«ã/rootãã§ã¯ãªãã/UNIONFS/rootããåºåããããããã¯æ³å®å ã§ããã
ãã®ã¹ã¯ãªããã«ã€ããŠããKnoppix 9.1ïŒ2021幎1æãªãªãŒã¹ïŒã®CDçã®è±èªçãããçè ã®æå³ããéãã®æ¯ãèããèŠããç°å¢ã ããšæå®ããŠãããã®ãããããªãããã ããKnoppix 9.1ããã¯ãã/rootãã§ã¯ãªãã/UNIONFS/rootããåºåããã®ããæ£è§£ãã§ããã
ãã®ã»ã¯ã·ã§ã³ã§ããããæç€ºããå®è¡çµæã«ã€ããŠã¯ãç¹ã«æç€ºãããªãéãã¯Lubuntu 22.04.1ã§ã®ãã®ã§ããã
ããŠããã®ã¹ã¯ãªããã§ã¯ãã»ãŒäžç®çç¶ã ãšã¯æãã5è¡ç®ãã8è¡ç®ãã¬ãŒãç¯ã«ãªã£ãŠããã
æç²ãããšä»¥äžã®ç®æã ã
if /bin/echo "x$1$2$3" | grep '[^a-z0-9/]' > /dev/null ; then
echo "error: invalid dir"
exit 1
fiãã®ã¬ãŒãç¯ã§ã¯ã$1 ãš $2 ãš $3 ãé£çµãããã®ã grep ã«æž¡ããŠãããæªããæåãèŠã€ãã£ãããã€ãŸãã¢ã«ãã¡ãããå°æåãæ°åãã/ãã§ã¯ãªããã®ãèŠã€ãã£ãããifæã®äžã«å ¥ã£ãŠãexit 1ãã§æããã
ãã®ã¬ãŒãç¯ã«ãã£ãŠãæåŸã»ãã«ãã realpath ã³ãã³ããå€ãªãã®ãåºåãããããªãããã«ãã¬ãŒããããŠããããã ã
ãªãã"x$1$2$3" ã®ããã«å é ã«ãxããæ¿å ¥ããŠããã®ã¯ã$1 ããã€ãã³ã§å§ãŸã£ãŠããæã« echo ãæ··ä¹±ããªãããã«ãšããé æ ®ã§ããã/bin/echo 以å€ã«ã expr ãªã©ã«ããããããã£ããé æ ®ããALTLãªãŒããŒãããŒã«ãããŠã¯åœåãã«ãªãããšããããããã®äŸã«ãããŠã¯ãã®ãxããããäœå㪠$3 ã®ã»ããåé¡ã§ããã
ãã®ã¹ã¯ãªããã®æ³å®ããŠããäœ¿ãæ¹ã¯ä»¥äžã®ãããªãã®ã ã
$ ./cdwdoc-2023-001_sample_dir.sh "user1" "abc"
/home/user1/abcãªãããuser1ãã®éšåã¯ç°å¢ã«åãããŠå€ããå¿ èŠãããããã®äŸã§ã¯ã/home/user1 ãšãããã£ã¬ã¯ããªãååšããŠããã®ãåæã ã
ããã« /home/user1/abc ãååšããŠããç¶æ ãªãã2ã€ç®ã®ã³ãã³ãã©ã€ã³åŒæ°ã«ã/ããå«ãŸããã±ãŒã¹ããããããšè©Šãããšãã§ããã
$ ls -l /home/user1/abc
total 0
$ ./cdwdoc-2023-001_sample_dir.sh "user1" "abc/"
/home/user1/abc
$ ./cdwdoc-2023-001_sample_dir.sh "user1" "abc////"
/home/user1/abc
$ ./cdwdoc-2023-001_sample_dir.sh "user1" "abc/def"
/home/user1/abc/def
$ ./cdwdoc-2023-001_sample_dir.sh "user1" "////abc////def////"
/home/user1/abc/def
$ ./cdwdoc-2023-001_sample_dir.sh "user1" "abc/def/../"
error: invalid dir2ã€ç®ã®ã³ãã³ãã©ã€ã³åŒæ°ã¯ãã../ãã®ãããªãã®ãå«ãããšã¯èš±å¯ãããªãããerror: invalid dirããšãããšã©ãŒã¡ãã»ãŒãžãåºåããŠçµäºããã
ã.ããšããã[a-z0-9/] ã§ãªãæåãå«ãŸããããã«ã¬ãŒãç¯ã®äžã®ãreturn 1ãã«ãã£ãŠããã°ã©ã ã¯ç¡äºã«çµäºããrealpath ã³ãã³ãã®ãšãããŸã§åŠçãé²ãŸãªãã
ãã®ãããã/rootãã衚瀺ãããããšããŠ2ã€ç®ã®ã³ãã³ãã©ã€ã³åŒæ°ãã../../rootãã®ããã«ããŠãããŸããããªãã
$ ./cdwdoc-2023-001_sample_dir.sh "user1" "../../root"
error: invalid dirã§ã以äžã®ããã«éæ¹ããªãåæ°ã../../../../../../ããšç¹°ãè¿ããããªæååãæž¡ããããã«3ã€ç®ã®åŒæ°ãæå®ãããšãã/rootãã衚瀺ãããããšãã§ããŠããŸãã
$ str="$(yes '../' | head -43684 | tr -d '\n')"
$ ./cdwdoc-2023-001_sample_dir.sh "user1" "${str}root" "aaaaaaaaaaaaaaaa"
./cdwdoc-2023-001_sample_dir.sh: 4: /bin/echo: Argument list too long
/root
$ echo $?
0ãhead -43684ãã®æ°åã®éšåã3ã€ç®ã®åŒæ°ã® "aaaaaaaaaaaaaaaa" ã®æ°ã¯ç°å¢ã«ãã£ãŠå€ããå¿ èŠããããããããªãã/bin/echo ã®ç®æã§ã¯ãArgument list too longãã®ãšã©ãŒãèµ·ããããã©ãæåŸã® realpath ã³ãã³ãã§ã¯ãšã©ãŒãèµ·ãããªãããšãããããªã¡ããã©è¯ãé·ãã«ããå¿ èŠãããã®ã ã
ããŠããã®ã¹ã¯ãªããïŒcdwdoc-2023-001_sample_dir.shïŒã®å Žåã¯ããArgument list too longãã®ãšã©ãŒãåºãããšãããããã«ã¬ãŒãç¯ãæå³ããããã«æ©èœããŠãªãããšãåé¡ã ã£ãã
ã§ã¯ããArgument list too longãã®ãããªãã®ãå«ããŠãäœãæ³åã ã«ããªããããªãšã©ãŒãåºããããªæã«ãã¬ãŒãç¯ã«ãã£ãŠæããããã«ã§ããªããã®ã ãããã
ifæã§ã¯ãif ! ...ãã®ããã«åŠå®åœ¢ã䜿ããç絡è©äŸ¡ã§ãªãã¹ãã||ãã䜿ãããã«ãããšããã®ã¯ã©ãã ãããã
ãã ããåè¿°ã®GNU Autoconfã®ããã¥ã¡ã³ãã«ãããšããif ! ...ãã®ãããªæžãæ¹ã¯äºææ§ããªããšã®ããšã§ããã
該åœç®æã¯ãããã以äžã®URLãéŠèš³ã®ã»ãã¯å€ãã®ã§æ å ±ãå°ãªãããšã«æ³šæã
https://web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html#IDX844
https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.71/autoconf.html#index-if
ãšããããã§ãã·ã§ã«ã¹ã¯ãªããã«ãããã¬ãŒãç¯ã¯ãç§»æ€æ§ãæèãããªã以äžã®ããã«æžãã®ãé²åŸ¡çïŒdefensiveïŒãšããããã§ããã
if ...(some check)... ; then :; else
return 1
fi
...(some sort of sensitive process)...åé¡ãä¿®æ£ããæ°ããããŒãžã§ã³ cdwdoc-2023-001_sample_dir2.sh ãèããŠã¿ãã
倿Žããã®ã¯ifæã®ãšããã ãã§ããã
cdwdoc-2023-001_sample_dir2.sh ( https://gitlab.com/-/snippets/2487377 )
# maybe robust to ALTL overflow
if /bin/echo "x$1$2$3" | grep -v '[^a-z0-9/]' > /dev/null ; then :; elseãã£ãæ»ç¥ã§ããã®ãšåãæ¹æ³ã§æ»æããŠã¿ããã
$ str="$(yes '../' | head -43684 | tr -d '\n')"
$ ./cdwdoc-2023-001_sample_dir2.sh "user1" "${str}root" "aaaaaaaaaaaaaaaa"
./cdwdoc-2023-001_sample_dir2.sh: 4: /bin/echo: Argument list too long
error: invalid dir
$ echo $?
1ä»åºŠã¯ã/rootãã¯åºåãããŠããªããçµäºã¹ããŒã¿ã¹ã 1 ã ã
ãã®æ°ããããŒãžã§ã³ cdwdoc-2023-001_sample_dir2.sh ã®å Žåã¯ãã¬ãŒãç¯ã§ãArgument list too longãã®ãšã©ãŒãåºãã«ãé¢ããããã¬ãŒãç¯ã®äžã®ãexit 1ãã«ãã£ãŠç¡äºã«æããŠããã®ã§ããã
/bin/echo ã䜿ã£ãŠããã«ãé¢ããããæ³å®å€ã®ããšãèµ·ãã£ãŠãå®å šåŽã«åããããã«ãªã£ãŠããããã倧ããªåé¡ã«ã¯ãªããªããšããã®ããã€ã³ãã ã
ãã ããã®ä¿®æ£çã¯ãgrep -v '[^a-z0-9/]'ããäºéã®åŠå®ã ããéçŽæçã§åããã«ããã-v ã®æã® grep ã®çµäºã¹ããŒã¿ã¹ã®ããæ¹ããã£ãŠãé ããããããã£ãŠãããã ã
$ printf '' | grep a ; echo $?
1
$ printf '' | grep -v a ; echo $?
1ãã®ããã-v ã¯äœ¿ããã«ãgrep '^[a-z0-9/]$'ããšããããªã人ããããããããªããããã§ããã£ã±ãæ£èŠè¡šçŸã®ã*ãã¯éããªãããã ãã ããããã¯ã-vãã䜿ãããã®ã ããšæã人ããããããããªãã
ã; then :; elseããªããŠæžãæ¹ã¯ãŸãã«ãããããŠããŠãšãããããã®ã ãçŸå®çã«ã¯ãBashéå®ãªããif !ããç©æ¥µçã«äœ¿ã£ãŠå¯èªæ§ãé«ããã»ãããããããããã /bin/echo ã§ã¯ãªãã<<<ãã䜿ã£ãã»ããããã ããã
ãŸãããããããããšããããšã§ãããªããifã§ãç絡è©äŸ¡ã§ããªã case ã䜿ããªãããšããã®ãèããŠã¿ãã»ãããããããããªãã
GNU Autoconfã®ããã¥ã¡ã³ãã§ããtest ã³ãã³ãã®è§£èª¬ã®ãšããã§ case ã expr ã®äœ¿çšãæšå¥šãããŠãããå€ãããŒãžã§ã³ïŒ2.59ïŒã®ã»ãã«ã¯ case ã¯ãã«ãã€ã³ïŒçµã¿èŸŒã¿ïŒãªã®ã§éããšããèšèŒããããããããšã¯å¥ã®èŠç¹ãšããŠãã«ãã€ã³ãªã®ã§ALTLãªãŒããŒãããŒã®åœ±é¿ãåããªããšèããããšãã§ãããã ããªã expr ã®ã»ãã«ã€ããŠã¯ãã«ãã€ã³ã§ã¯ãªãã
該åœç®æã¯ãããã以äžã®URLãéŠèš³ã®ã»ãã¯å€ãã®ã§åŸ®åŠã«å 容ãéãããšã«æ³šæã
https://web.sfc.wide.ad.jp/~sagawa/gnujdoc/autoconf-2.59/autoconf-ja_10.html#IDX850
https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.71/autoconf.html#index-test
ãã ããããã§ã¯çŸå®çãªãšã³ãžãã¢ãªã³ã°ãšããŠåŠ¥åœãªæžãæ¹ãã©ãããšããããšãšã¯å¥ã«ããããªã«éã©ãèŠçŽ ãããããããããã«ã¿ããã«ãé¢ãããå®ã¯å®å šã§ãããšãããããªãããããæžãæ¹ãã§ãããšããããšã«çç®ãããã®ã§ããã
ã¡ãªã¿ã«ããªãŒããã«ã³ãŒããã®ã7.2 if/else ãããã¯ã®äžŠã³é ãïŒ2012幎åã®éŠèš³ã§ã¯P.87ïŒã§ã¯ä»¥äžã®ããã«ããã
æ¡ä»¶ã¯åŠå®åœ¢ãããè¯å®åœ¢ã䜿ããäŸãã°ãif (!debug) ã§ã¯ãªããif (debug) ã䜿ãã
ãããªã®ã ããif !ããç©æ¥µçã«äœ¿ããããªã©ãšæšå¥šããã®ã¯äžèšã®ååãšçæ£é¢ãããè¡çªãããããšã«ãªã£ãŠããŸãã®ã§ããã
ã¡ãªã¿ã«ãã¬ãŒãç¯ã®ifæã§ãif !ããç©æ¥µçã«äœ¿ã£ããç絡è©äŸ¡ã§ã¯ãªãã¹ãã||ãã䜿ãããã«ãããšããã®ã¯ãå¿ ãããã·ã§ã«ã¹ã¯ãªããéå®ã®ãããããŠããŠãšã¯ãããªããã®ããããããã«ã€ããŠã¯ã®ã¡ã®ã»ã¯ã·ã§ã³ãã·ã§ã«ã¹ã¯ãªãã以å€ã®èšèªã«ãããALTLãªãŒããŒãããŒãã§ãããããŠè¿°ã¹ãã
ãªãããããŸã§ã§è¿°ã¹ãŠããããšã¯ãã¬ãŒãç¯ã§æããããããã®ããå®å šåŽã«åãããšãããã®ã«ãªã£ãŠãããããªç¶æ³ãåæã§ããã
ããå±éºãªãŠãŒã¶ãŒã ã£ããæåŸã«trueãè¿ãïŒã·ã§ã«ã¹ã¯ãªããã®å Žåã¯ãexit 0ãããreturn 0ãã§çµäºïŒãšãããããªé¢æ°ã®å Žåãã¬ãŒãç¯ã§æãã«ããããã®ããå®å šåŽã«åãããã®ãšãªããå転ããããšã«æ³šæããå¿ èŠãããã
ããããæ°ãã颿°ïŒãããã¯ã³ãã³ãïŒãçšæããããšããæã«ã¯ãã¬ãŒãç¯ã§æããããããã®ããå®å šåŽã«åãããã®ã«ãªãããã«çµ±äžããã®ãæãŸãããšããããšã«ãªãããã ããã·ã¹ãã å šäœãè€éã«ãªã£ãŠãããšããç°¡åã«ã¯ãããªããããããªãã
ãšããã§ããããŸã§èããŠããã¹ã¯ãªããã¯ã¿ãªãèªåã«æž¡ãããã³ãã³ãã©ã€ã³åŒæ°ããã®ãŸãŸäœ¿çšããŠããã
ããã§ãããã¹ããã¡ã€ã«ããèªã¿åã£ãããŒã¿ãå©çšããå Žåã«ã©ããªãã®ãèããŠã¿ãããããã¯ã€ãŸãããããããæ»æè ãããã¹ããã¡ã€ã«ã®äžã«å·šå€§ãªæååãçŽã蟌ãŸããããšãã§ãããããªå Žåã§ããã
cdwdoc-2023-001_sample_dir3.sh ( https://gitlab.com/-/snippets/2488619 )
#!/bin/sh
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
user_home_dir=$(grep "^$1"':' < passwd.txt | head -1 | awk -F: '{print $6}')
[ "dummy$user_home_dir" = "dummy" ] && exit 1
# too optimistic
if /bin/echo "dummy$user_home_dir" | grep '[^a-z0-9/]' > /dev/null ; then
echo "error: invalid dir" >&2
exit 1
fi
realpath "$user_home_dir"
exit 0ãã®ã³ãŒãã¯ã«ã¬ã³ããã£ã¬ã¯ããªã«ãã passwd.txt ããæååãæœåºããŠãæåŸã« realpath ã«æž¡ããŠãããæž¡ãåã«ãæååã®ãã§ãã¯ã®ã³ãŒããããã
cdwdoc-2023-001_sample_dir.sh ãªã©ã§ã¯ã³ãã³ãã©ã€ã³åŒæ°ãå å·¥ããŠããæåŸã« realpath ã«æž¡ããŠããããã ããä»åã¯ããã¹ããã¡ã€ã«ããæœåºãããã®ã realpath ã«æž¡ãããã«ãªã£ãŠããã
ifæã®ãšããã§ã¯æ»æãæåããããããã«ãxãã§ã¯ãªããdummyããšãªã£ãŠããããåºæ¬çã«ã¯ cdwdoc-2023-001_sample_dir.sh ã®ifæãšåãã ã
passwd.txt 㯠/etc/passwd ãšäŒŒãŠãããšãããããã1ã€ç®ã®ã«ã©ã ããŠãŒã¶ãŒåã§6ã€ç®ã®ã«ã©ã ããã£ã¬ã¯ããªã§ãããããªããŒã¿ãæ³å®ããŠããã
/etc/passwd ããã®ãŸãŸäœ¿ãããšãã§ããã
$ cp /etc/passwd passwd.txt
$ ./cdwdoc-2023-001_sample_dir3.sh root
/root
$ ./cdwdoc-2023-001_sample_dir3.sh games
/usr/gamesãããã瀺ãäŸã§ã¯ã/home/user1 ãšãããã£ã¬ã¯ããªãååšããŠããã®ãåæã§ããã
æ°èŠã§ passwd.txt ãäœãçŽããŠè©ŠããŠã¿ãããŸãã¯6ã€ç®ã®ã«ã©ã ãã/home/user1ãã«ãªã£ãŠãããã®ã
$ echo 'user1:::::/home/user1:/bin/sh' > passwd.txt
$ ./cdwdoc-2023-001_sample_dir3.sh user1
/home/user1ã§ã¯6ã€ç®ã®ã«ã©ã ãã/home/user1/../../rootãã®ãããªãã®ã ã£ãå Žåã©ããªããã
$ echo 'user2:::::/home/user1/../../root:/bin/sh' > passwd.txt
$ ./cdwdoc-2023-001_sample_dir3.sh user2
error: invalid dirã¡ãããšäžæ£ãªãã®ãšèªèã§ããŠãããã§ã¯ãããããšã©ããªããã
$ printf 'user3:::::/home/user1/' > passwd.txt
$ yes '../' | head -43684 | tr -d '\n' >> passwd.txt
$ printf 'root:/bin/sh\n' >> passwd.txt
$ ./cdwdoc-2023-001_sample_dir3.sh user3
./cdwdoc-2023-001_sample_dir3.sh: 9: /bin/echo: Argument list too long
/rootãã¯ãã/rootããåºåããŠããŸã£ãã
ãããŸã§ã®äŸã§ cdwdoc-2023-001_sample_dir.sh ãã¹ã¯ãªããåäœãšããŠã¿ãŒããã«ãã詊ãéã«ã¯ã詊ãããšãã人èªèº«ãåŒæ°ã®é·ãã®å¶çŽã®åœ±é¿ãåãããããªç¶æ³ã°ããã ã£ãããã ããcdwdoc-2023-001_sample_dir3.sh ã®å Žåã¯æ»æè ã passwd.txt ã«å·šå€§ãªæååãçŽã蟌ãŸããéã«ã¯ããããå¶çŽã®åœ±é¿ãåãããšã¯éããªãã
cdwdoc-2023-001_sample_dir.sh ã®å Žåã¯ããšãå€éšã®ããã°ã©ã ããå©çšãããå Žåã§ããæ»æè ã¯ãµã€ãºã«ã€ããŠ3ã€ã®å¶çŽãåããã
cdwdoc-2023-001_sample_dir.sh ãèµ·åã§ããçšåºŠã«ã¯å°ãã
/bin/echo ã®ç®æã§ãããçšåºŠã«ã¯å€§ãã
realpath ãèµ·åã§ããçšåºŠã«ã¯å°ãã
cdwdoc-2023-001_sample_dir3.sh ã®å Žåã¯ããèªäœã®èµ·åã®ããšã¯æ»æè ã¯èããå¿ èŠã¯ãªããå¶çŽã¯ä»¥äžã®2ã€ã ãã ã
/bin/echo ã®ç®æã§ãããçšåºŠã«ã¯å€§ãã
realpath ãèµ·åã§ããçšåºŠã«ã¯å°ãã
çŸå®çã«ã¯ãcdwdoc-2023-001_sample_dir3.sh ã®å Žå㯠passwd.txt ãæŽæ°ããããã°ã©ã ã«ãããŠãŠãŒã¶ãŒããããªãã/rootãã®ãããªãã®ãç»é²ããããšã¯ã§ããªããã®ã®ãã/home/user1/../../rootãã®ãããªãã®ã§ããã°ç»é²ã§ããããã«ãªã£ãŠãããšããã®ãåæããšããããšã«ãªãã ãããäŸãã°ããŠãŒã¶ãŒãç»é²ããããšããŠããæååã®å é ãã/home/ãã§å§ãŸã£ãŠãããã©ããã ãã¯å³å¯ã«ãã§ãã¯ããŠãããšããããã«ã
ãŸããæ»æè ãã·ã³ããªãã¯ãªã³ã¯ãäœæãããã¯ã§ããªããšããã®ãåæã«ãªãã ãããrealpath ã¯ã·ã³ããªãã¯ãªã³ã¯ããã©ã£ãçµæãåºåãããGNU coreutilsã® realpath éå®ãšããããšã§ãããªãããrealpath -sãã§ã·ã³ããªãã¯ãªã³ã¯ããã©ããªãããã«ããããšã¯å¯èœã§ã¯ããã
ããã¯ãããŸã§ãäŸãšããŠããã¹ããã¡ã€ã«ãå©çšããŠããããSQLiteãå©çšããã·ã§ã«ã¹ã¯ãªããã§ã¯ãæ»æè ãæ»æå¯Ÿè±¡ã®ãã·ã³äžã«å·šå€§ãªæååãä¿åã§ãããããªã«ãŒãã倿°ååšããŠãããããããªãã
ãŸããæ»æè ãæ»æå¯Ÿè±¡ã®ãã·ã³ã«å·šå€§ãªæååãä¿åãããšããçºæ³ã§ã¯ãªããäŸãã°ã·ã§ã«ã¹ã¯ãªããã§æžãããã¯ããŒã©ãŒããããããªå Žåã«ãè匱ãªã¯ããŒã©ãŒãæ»æçšããŒãžãèªã¿èŸŒãã ç¬éã«ALTLãªãŒããŒãããŒãèµ·ããããã«ããããšããã®ãçè«äžã¯å¯èœã ã
cdwdoc-2023-001_sample_dir3.sh ã®å Žåã¯ã/bin/echo ã®ç®æä»¥å€ã«ããgrep "^$1"':'ããšããç®æã«ãèŠæ³šç®ã§ããã
user_home_dir=$(grep "^$1"':' < passwd.txt | head -1 | awk -F: '{print $6}')$1 ã巚倧ã ã£ãå Žåã« grep ã®èµ·åã«å€±æããããšãããããããã ã
ãã ãããã®å Žå㯠grep ã®èµ·åã«å€±æããŠã倿° user_home_dir ã空ã«ãªãã ãã§ãæ»æè ãæªæã®ããããŒã¿ãèªã¿èŸŒãŸãããåºæ¥ãããã§ã¯ãªãã
/bin/echo ã®ãããªæžãæ¹ã¯äžåããªããšããå Žåã§ããgrep ã®åŒæ°ãåçã«å€æŽããããšããããŒãºã¯ãšãŠãé«ãã2014幎ãªãªãŒã¹ã®GNU grep 2.17ã§ã¯å€§å¹ ãªé«éåã«æåããããæè¿ã§ã¯Rust補㮠ripgrep ã話é¡ã ã£ããããããã grep ã®ãããªãã®ãã·ã§ã«ã®ãã«ãã€ã³ãšããŠååšããŠããã°ããšæãããšãããããããããçºæ³ã¯ã·ã§ã«ã®è¯ããæãªããšããããšã«ãªããããããªãã
ãã ããçŸç¶ã®ã·ã§ã«ã§ãè€éãªæ£èŠè¡šçŸãå¿ èŠãªããªãåè¿°ã®ããã«ãã«ãã€ã³ã® case ã䜿ããšããæã¯ããã
ãªãããã®ã»ã¯ã·ã§ã³ã§ã® realpath ã䜿ã£ããµã³ãã«ã¯ãæ¹è¡ãå«ãæååãæž¡ãããå Žåã®ããšã«ã€ããŠã¯èæ ®ããŠããªãããšã«æ³šæããŠã»ããã
ã¬ãŒãç¯ã®äžã«ããäžã€æãããã¿ãŒã³ãçšæããŠããã§è¡æ°ã«ãã£ãŠå€å®ããå Žåã¯ãè¡æ°ãã1以å€ã¯ãã¹ãŠæªããããšã¿ãªãããžãã¯ããããšããããšã«ãªãããšã©ãŒãªã©ã§ç°åžžçµäºããå Žåã¯è¡æ°ãã0ãã«ãªãããããããã2以äžãªãæªããããšããããžãã¯ã ãšããæããŠããŸãå¯èœæ§ãåºãŠããã®ã§ããã
$ str="$(yes 'a' | head -999999)"
$ line_num="$(/bin/echo "$str" | grep ^ | wc -l)"
bash: /bin/echo: Argument list too long
$ echo "$line_num"
0ã¡ãªã¿ã«ãgrep ^ãã¯æ«å°Ÿã«æ¹è¡ããªãå Žåã«è¿œå ããããã®ãã®ã§ãããgrepããå°ãé ããããããªãããawk 1ããªã©ã§ãåã广ãåŸãããããããããç§»æ€æ§ïŒäºææ§ïŒã®åé¡ãã©ã®çšåºŠå€§ãããã¯ç¥ããªãã
GNU Autoconfã®ããã¥ã¡ã³ãã§ã¯ãAIXã® grep ã¯é·ãè¡ããé»ã£ãŠåãæšãŠããïŒsilently truncatesïŒãšããã®ã¯æ°ã«ãªããšããã§ããããŸãSolaris 11.4ã® /usr/bin/awk ã¯ãawk 1ããšããæžãæ¹ã¯ã·ã³ã¿ãã¯ã¹ãšã©ãŒã§ãçµå±ãawk '/^/'ãããawk 1==1ãããawk '{print}'ããç¡é£ãšããããšã«ãªãã®ãããããªãããããŠSolaris 11.4ã® /usr/bin/awk ã«ãé·ãè¡ãããŸãåŠçã§ããªããšããåé¡ãããããOpenIndiana 2022.10ã® /usr/bin/awk ã¯é·ãè¡ãç¹ã«åé¡ã¯ãªãããawk 1ããè§£éã§ããã
ãªããGNU Autoconfã®ããã¥ã¡ã³ãã§ã® grep ã«ã€ããŠã®ç®æã¯ä»¥äžã®URLã
https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.71/autoconf.html#index-grep
ïŒweb.sfc.wide.ad.jp ã«ããéŠèš³ã®ã»ãã¯å€ãããŒãžã§ã³ã®ç¿»èš³ãªã®ã§ããã®ç®æã¯ãªãããšã«æ³šæïŒ
ãšããã§ãå ã»ã©ãããšãå€éšã®ããã°ã©ã ããå©çšãããå Žåã§ãããšããèšãæ¹ãããããããã¯ã·ã§ã«ã¹ã¯ãªããã§äŸãšããŠç€ºãéã«èª€è§£ãæãããããã€ã³ãã§ããã
cdwdoc-2023-001_sample_dir.sh ã cdwdoc-2023-001_sample_dir3.sh ã¯ã¹ã¯ãªããåäœãšããŠã¿ãã°åã« realpath ã³ãã³ããæ£èŠåãããã£ã¬ã¯ããªãåºåããŠããã§çµãããªã ãã ãããããã®ã¹ã¯ãªãããå€éšããåŒã¶ããã°ã©ã ãããæã«è匱æ§ã«ã€ãªããå¯èœæ§ãããããã®å€éšã®ããã°ã©ã ïŒã·ã§ã«ã¹ã¯ãªãããšã¯éããªãïŒãããããã®ã¹ã¯ãªããã¯ãã£ã¬ã¯ããªãã©ããŒãµã«ãèµ·ãããªããããªãã§ãã¯ãããŸãããªããŠãããã¯ãã ãšå šé¢çã«ä¿¡é ŒããŠããã°ãæ³å®ããªããã£ã¬ã¯ããªã«ãããã¡ã€ã«ãžã®ã¢ã¯ã»ã¹ãåŒãèµ·ããããå¯èœæ§ãããã
ãŸããcdwdoc-2023-001_sample_dir.sh ãã¿ãŒããã«ãã詊ãéã«ã¯å·šå€§ãªæååãçŽæ¥ã³ãã³ãã©ã€ã³åŒæ°ãšããŠæå®ããããã ããcdwdoc-2023-001_sample_dir.sh ãå€éšã®ããã°ã©ã ããåŒã°ããå Žåã¯ããã®å€éšã®ããã°ã©ã ã¯ããã¹ããã¡ã€ã«ããæœåºããããŒã¿ãå ã« cdwdoc-2023-001_sample_dir.sh ãèµ·åããããšãããããããªãã®ã§ããã
察話çã«ã®ã¿äœ¿ãããããšãåæã«ãªã£ãŠãããããªãã®ãé€ããåºæ¬çã«ãã¹ãŠã®ã·ã§ã«ã¹ã¯ãªããã¯ãæœåšçã«ã©ã€ãã©ãªé¢æ°ã®ãããªååšã«ãªãå¯èœæ§ãããããšã«æ³šæããå¿ èŠããããç¬ç«æ§ã®é«ãããã°ã©ã ã¯ã察話çã«ã®ã¿äœ¿ãããã³ãã³ããGUIã¢ããªã«ããããã°ãšã¯éãã®ã§ããã
çè ãå»å¹ŽïŒ2022幎ïŒã«å ±åãã CVE-2022-1271 㯠zgrep ã³ãã³ãã xzgrep ã³ãã³ãã®è匱æ§ã ãããã®è匱æ§ã«é¢é£ãããã®ãããã§ãªãäžè¬çãªäœ¿ãæ¹ã«ã€ããŠããWebäžã§ãzgrepããªã©ã§æ€çŽ¢ãããš zgrep ãã¿ãŒããã«ãã察話çã«å©çšãããµã³ãã«ãããããèŠã€ãããã ããããã zgrep ã¯å€éšã®ããã°ã©ã ããåŒã°ããå¯èœæ§ãããããã®å€éšã®ããã°ã©ã ã¯ã·ã§ã«ã¹ã¯ãªãããšã¯éããªãã
CVE-2022-1509 ã®ã»ã㯠HestiaCP ãšããWebã³ã³ããã®è匱æ§ã§ãã·ã¹ãã å šäœã倿°ã®ã·ã§ã«ã¹ã¯ãªãããšå€æ°ã®PHPããã°ã©ã ã§æ§æãããŠãããçè ãå ±åãããã®ã«ã€ããŠãããããããPHPã®åŽã§å ¥å¿µã«æååããã§ãã¯ããŠããã·ã§ã«ã¹ã¯ãªãããåŒã¶ããã«ããã°Webçµç±ã§ã®æ»æã¯é²ããããã«ãªã£ãŠããå¯èœæ§ããããã§ããã¯ãããã¯ãã·ã§ã«ã¹ã¯ãªããã®åŽã§ä¿®æ£ãã¹ããªã®ã ããã®ãããªã·ã¹ãã ã§ã¯ã·ã§ã«ã¹ã¯ãªãã矀ãã©ã€ãã©ãªãšããŠæ©èœããŠããããã§ãã·ã§ã«ã¹ã¯ãªããã®åŽãä¿®æ£ããªããã°ã©ã€ãã©ãªã®ãã°ãæ®ãç¶ããããšã«ãªãã
ãªããcdwdoc-2023-001_sample_dir.sh ã cdwdoc-2023-001_sample_dir3.sh ã®è匱æ§ãå©çšããŠå®éã«æ³å®å€ã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ãããå Žåããããããã®ã¯éåžžã¯ããã£ã¬ã¯ããªãã©ããŒãµã«ã®è匱æ§ããšããããšã«ãªãã®ã§ã¯ãªãããšæãã
ã€ãŸããéå»ã«èŠã€ãã£ãè匱æ§ã§ããã£ã¬ã¯ããªãã©ããŒãµã«ã®è匱æ§ããšããŠèªèãããŠãããã®ã®äžã«ã¯ãæ»æã®éã«ãALTLãªãŒããŒãããŒããå©çšããå¿ èŠããããããªè匱æ§ãååšããŠããå¯èœæ§ãããã
ãã£ã¬ã¯ããªãã©ããŒãµã«ã«éãããOSã³ãã³ãã€ã³ãžã§ã¯ã·ã§ã³ãå«ããããããã€ã³ãžã§ã¯ã·ã§ã³ç³»ã®è匱æ§ã«ãããŠãåãããšããããã
ãããããããã§èããŠãããALTLãªãŒããŒãããŒããšã¯ããSQLã€ã³ãžã§ã¯ã·ã§ã³ããšãããã£ã¬ã¯ããªãã©ããŒãµã«ããšãã£ãäžè¬çãªè匱æ§ã®åŒç§°ãšååã®ãã®ãšããããã¯ãæ§ã ãªã»ãã¥ãªãã£å¯Ÿçããããããããã®ææ³ã®äžã€ããšããŠæããããšãã§ãããããããªãã
ãã ãããã¯ALTLãªãŒããŒãããŒã®ããåŽé¢ã«ãããªãã
åé ã®åºé¡ã§ã® cdwdoc-2023-001_challenge.sh ã®ããã«ãçåœå€å®ã®æ··ä¹±ãå³ãæ£åœãªãŠãŒã¶ãŒãã©ããã®å€æã®æ··ä¹±ã«çŽçµããŠããããšãããããªã±ãŒã¹ããã¯ãçŸå®ã«ããã®ã§ã¯ãªããããšçè ã¯èããŠããããã§ããã
ã
Bashéå®ã®è©±é¡
ãã®ã»ã¯ã·ã§ã³ã¯Bashéå®ã®æåã«èå³ããªããã°èªã¿é£ã°ããŠããã£ãŠãããŸããªãã
ãªããåé ã®åºé¡ã®BashããŒãžã§ã³ã以äžã«çœ®ããŠãããããŸãå
¥å¿µã«ãã§ãã¯ã¯ããŠããªããããã®BashããŒãžã§ã³ãåºæ¬çã«ã¯åãæ¹æ³ã§æ»ç¥ã§ããã¯ãã§ããã
https://gitlab.com/-/snippets/2502445
ãã®BashããŒãžã§ã³ã§ã¯ããset -eããset -uããset -o pipefailããset -o posixãã®4ã€ãæå®ãããŠããããããããã®ãæå®ããã ãã§ã¯ããŸããæžãæ¹ãããŠããæã®èª€åäœãé²ãããšã¯Bashã§ãã§ããªãããšãåããã
ãset -o posixããããããšã«ãã£ãŠBashã®æ©èœããªãã«ãªã£ãŠããŸã£ãŠããã®ã§ã¯ããšæã人ã¯ãã®è¡ãã³ã¡ã³ãã¢ãŠãããŠæåã確ãããŠã¿ãŠã»ããã
ããŠããã®èšäºã§ã¯ãããŸã§ã«ãBashã«ã€ããŠè§ŠããŠããã
ã; then :; elseãã®ãããªããã¯ã§ã¯ãªãå®å¿ããŠãif !ãå©çšå¯
ãã¢ã¹ããªã³ã°ïŒã<<<ãïŒããã
ãã«ãã€ã³ç¡å¹åã® enable ãããïŒã<<<ãã®äŸ¡å€ãé«ãŸãïŒ
Bashã§ãªããset -eãããset -o pipefailãã¯ãããªãã«æçš
ãset -o pipefailããããŠããæã¯ãã<<<ãã®äŸ¡å€ãé«ãŸã
ä»£å ¥æã®ãšã©ãŒã§ç©ºæååã«ãªãã®ã¯Bashã§ãã£ãŠããset -uãã§ã¯æ€åºäžå¯ããã ããset -o pipefailãã§æ€åºå¯èœ
ãããã®äžã®ç¹ã« set é¢é£ã«ã€ããŠããã®ã»ã¯ã·ã§ã³ã§è¿°ã¹ãŠããããã
ãªãããã®ã»ã¯ã·ã§ã³ã§ã®å®è¡ç°å¢ã¯ä»¥äžã§ããã
$ bash --version | head -1
GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
$ shuf --version | head -1
shuf (GNU coreutils) 8.32
$ grep --version | head -1
grep (GNU grep) 3.7
$ cat /proc/version
Linux version 5.15.0-66-generic (buildd@lcy02-amd64-076) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #73-Ubuntu SMP Fri Feb 3 14:23:37 UTC 2023131071 ãªã©ã®æ°åã®éšåã¯å€æŽããŠSolaris 11.4ïŒ2018幎ãªãªãŒã¹ïŒã§ã詊ããŠããã
$ bash --version | head -1
GNU bash, version 4.4.19(1)-release (x86_64-pc-solaris2.11)
$ shuf --version | head -1
shuf (GNU coreutils) 8.27
$ uname -a
SunOS solaris 5.11 11.4.0.15.0 i86pc i386 i86pcãset -eãïŒset -o errexitïŒã¯ãšã©ãŒçºçæïŒçµäºã¹ããŒã¿ã¹ã 0 ã§ãªããã®ãæ€åºããæïŒã«ããã§ã¹ã¯ãªããå šäœãçµäºããããã«ããããã®ãã®ã§ããã
$ cat settest.sh
#!/usr/bin/env bash
set -e
echo aaa
false
echo bbb
$ ./settest.sh
aaaãset -eãã¯ãã€ãã®æ«å°Ÿã®ã³ãã³ãã®çµäºã¹ããŒã¿ã¹ãéèŠã§ãããæ«å°Ÿã 0 ã§çµäºããŠããã°ãã¹ã¯ãªããå šäœã®çµäºã¯ããªãã
$ cat settest2.sh
#!/usr/bin/env bash
set -e
echo aaa
false | cat
echo bbb
$ ./settest2.sh
aaa
bbbãŸããset -eãã¯ãç絡è©äŸ¡ã®å Žåãæ«å°ŸãéèŠã§ãããæ«å°Ÿã 0 ã§çµäºããŠããã°ãã¹ã¯ãªããå šäœã®çµäºã¯ããªãã
$ cat settest3.sh
#!/usr/bin/env bash
set -e
echo aaa
false || false || false || echo xxx
echo bbb
$ ./settest3.sh
aaa
xxx
bbbãŸããset -eãã¯ãifæãªã©ïŒwhile ã until ãå«ãïŒã®æ¡ä»¶ã®ç®æã§ã¯ã0 以å€ã§çµäºããŠããŠãã¹ã¯ãªããå šäœã®çµäºã¯ããªãã
$ cat settest4.sh
#!/usr/bin/env bash
set -e
echo aaa
if false; then
echo xxx
fi
echo bbb
$ ./settest4.sh
aaa
bbbBashãZshã«ã¯ãset -o pipefailããããããã€ãã®éäžã§ 0 以å€ã®çµäºã¹ããŒã¿ã¹ã§çµäºãããã®ãããã°ããã®æåŸã®ãã®ãäŒæããã
$ set -o pipefail
$ true | true | true | true
$ echo $?
0
$ true | false | true | true
$ echo $?
1
$ true | ( exit 100 ) | true | true
$ echo $?
100
$ true | ( exit 10 ) | ( exit 20 ) | ( exit 30 ) | true | true
$ echo $?
30pipefailã®ç»å Žã¯Bash3.0ïŒ2004幎ãªãªãŒã¹ïŒã§ããã
ãã·ã§ã«ã¹ã¯ãªããã«ãããçŸå®çãªæ³šæç¹ãã®ã»ã¯ã·ã§ã³ã§ realpath ã䜿ã£ããµã³ãã«ãæç€ºãããããã®äžã«ã¯ãset -o pipefailãã§è§£æ±ºã§ãããã®ãããã
ãã ããåé ã®åºé¡ã®ãããªãã®ã¯ãset -eãããset -o pipefailãã§ã¯è§£æ±ºã§ããªãã
ãªãããset -o pipefailããšãset -eããšã®çµã¿åããã¯ã以äžã®ãããªã¡ãã£ãšããå®éšã倱æããããšã«ãªãã
cdwdoc-2023-001_bashtest.sh ( https://gitlab.com/-/snippets/2502302 )
#!/usr/bin/env bash
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
set -e
set -o pipefail
echo '======== 1'
str="$(yes 'a' | head -131071 | tr -d '\n')"
echo "${#str}"
echo '======== 2'
/bin/echo "$str" | wc -c && echo aaa
echo '======== 3'
/bin/echo "$str$str" | wc -c && echo bbb
echo '======== 4'
/bin/echo "$str$str" | wc -c
echo '======== 5'
/bin/echo "$str$str" > /dev/null
echo 'done.'
ãããå®è¡ãããšã======== 1ããã衚瀺ãããªãã
$ ./cdwdoc-2023-001_bashtest.sh
======== 1yes ã SIGPIPE ã§çµäºããŠããããã ãyes ã䜿ã£ããã€ãã©ã€ã³ã®æ«å°Ÿã«ã|| trueããå ãããšããããªãã¹ã¯ãªãããçµäºãããšããããšã¯ãªããªãã
cdwdoc-2023-001_bashtest2.sh ( https://gitlab.com/-/snippets/2502302 )
ããæç²ã
str="$(yes 'a' | head -131071 | tr -d '\n' || true)"ãããå®è¡ãããšãæåŸ ããŠããçµæã«ãªã£ããã======== 4ãã¯åºåããããã======== 5ãã¯åºåãããªãã
$ ./cdwdoc-2023-001_bashtest2.sh
======== 1
131071
======== 2
131072
aaa
======== 3
./cdwdoc-2023-001_bashtest2.sh: line 14: /bin/echo: Argument list too long
0
======== 4
./cdwdoc-2023-001_bashtest2.sh: line 16: /bin/echo: Argument list too long
0ã¡ãªã¿ã«ãset -o pipefailãã®è¡ãã³ã¡ã³ãã¢ãŠããããšããbbbããã======== 5ããåºåãããã¯ãã§ããã
ãªããã|| trueãã§ã¯ãªãã°ã«ãŒãã³ã°ã䜿ã£ãŠãyes 'a'ããã{ yes 'a' ;:; }ãã®ããã«ãããšããæ¹æ³ãããã
ã|| trueããšããæžãæ¹ãã°ã«ãŒãã³ã°ã䜿ãã®ã¯è¥å¹²ããªãããŒã«èŠãããããããªããããã«ã|| trueãã¯ãã£ããã®ãšã©ãŒæ€åºã®æ©äŒã奪ããããããªãããŸããset -eããset -o pipefailãã«å ããŠãset -o posixããããŠãããšã{ yes 'a' ;:; }ãã¯ãããªãçµäºããããšã«ãªããããããªãã
ãšããããã§ãSIGPIPE ãçºçããªãæžãæ¹ãèããŠã¿ããäŸãã°ãGNU coreutils 8.22ããã³ãã以éãåæãªããyes ãš head ã®çµã¿åãã㯠shuf ã§ã代çšã§ããã
cdwdoc-2023-001_bashtest3.sh ( https://gitlab.com/-/snippets/2502302 )
ããæç²ã
str="$(shuf -r -e a -n 131071 | tr -d '\n')" # GNU coreutils 8.22 or laterå ã»ã©ãšåãçµæã«ãªãã¯ãã§ããã
$ ./cdwdoc-2023-001_bashtest2.sh 2> /dev/null | sha256sum
428432f4a11979167836aba9e6a62baf85fbab795711ec9d6293b9adc31e3a33 -
$ ./cdwdoc-2023-001_bashtest3.sh 2> /dev/null | sha256sum
428432f4a11979167836aba9e6a62baf85fbab795711ec9d6293b9adc31e3a33 -shuf 以å€ã«ããseq ã jot ã§ã SIGPIPE ãçºçããªãããã«ã§ããã
yes ãš head ã®çµã¿åãã㯠SIGPIPE ãã»ãŒç¢ºå®ã«çºçãããšèããŠãããã SIGPIPE ããããã圱é¿ã«æ°ã¥ããããããåä»ãªã®ã巚倧ãªããŒã¿ã®æã ã SIGPIPE ãçºçãã grep ã head ã§ããã
ãset -o pipefailããããŠããæã¯ããã€ãããåãåã grep ã§ã¯ã-qããš ã> /dev/nullãã§éãæåã«èŠããããšããããããããªãã
cdwdoc-2023-001_bashtest4.sh ( https://gitlab.com/-/snippets/2502302 )
#!/usr/bin/env bash
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
str="$(yes 'a' | head -2999999)"
echo "$str" | grep -q a && echo 'FOUND(1)'
set -o pipefail
echo "$str" | grep -q a && echo 'FOUND(2)'
echo "$str" | grep a > /dev/null && echo 'FOUND(3)'
echo 'done.'å®è¡ãããšä»¥äžã«ãªãã
$ ./cdwdoc-2023-001_bashtest4.sh
FOUND(1)
FOUND(3)
done.äžèšã®ãµã³ãã«ã¯ãhead -99999999ãã®æ°ããã£ãšå°ãªããããšãFOUND(2)ããåºåãããã
ããã¯ã€ãŸãããset -o pipefailããããŠããæãšããã®ã¯ãå°ããããŒã¿ã ãæ±ã£ãŠããæã¯åé¡ãªããã倧ããããŒã¿ãæ±ãå§ããŠããæ¥ã«ä»¥åãšæåãå€ãã£ãŠå°æããããšããããšãèµ·ããããããã ã
ã¡ãªã¿ã« grep ã«ãããã> /dev/nullã㯠SIGPIPE ãçºè¡ããªãã®ã ãšèããŠããã®ãã©ããã¯çè ã«ã¯ããåãããªãã
ã-qããšã> /dev/nullãã§ã®æ¯ãèãã®éãã¯ãGNU grep以å€ã§ããFreeBSD 13.1-RELEASEãOpenBSD 7.2ã® /usr/bin/grep ã§ããããªãã
ãŸããSolaris 11.4ãOpenIndiana Hipster 2022.10ã«ã¯è€æ°ã® grep ããããã以äžã®å šãŠã§ãããªãã
/usr/bin/grep
/usr/xpg4/bin/grep
/usr/gnu/bin/grep
ãªããäžèšã®ãµã³ãã«ã§ã¯ /bin/echo ã§ã¯ãªããã«ãã€ã³ã® echo ã䜿ã£ãŠããããã㊠SIGPIPE ãçºè¡ãããæããã«ãã€ã³ã® echo ã printf ã«ã€ããŠã¯ã{ echo "$str" ;:; }ãã®ããã«ã°ã«ãŒãã³ã°ããã ãã§ã¯è§£æ±ºããªãããã ãããã¯ZshïŒLubuntu 22.04.1ã® zsh 5.8.1 ãGhostBSD 22.06.18ã® zsh 5.9ïŒã§ãåæ§ã§ããã
ããããããšãããããããset -o pipefailããããŠããæã¯ã<<<ãã®äŸ¡å€ãé«ãŸããšããããã§ããã
ãset -uãã«ã€ããŠãèããŠã¿ãã
ä»£å ¥ãããŠãããšããã§ãArgument list too longããªã©ã®ãšã©ãŒãåºãå Žåããset -uãã§ã¯æ€åºã§ãã倿°ã¯ç©ºæååã«ãªãã
cdwdoc-2023-001_bashtest5.sh ( https://gitlab.com/-/snippets/2502302 )
#!/usr/bin/env bash
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
str="$(yes 'a' | head -2999999 | tr -d '\n')"
echo "${#str}"
echo ========
#set -e
set -u
set -o pipefail
#set -o posix
pickup="$(/bin/echo "${str}x" | tr -d a)"
echo $?
echo "$pickup"
echo "${#pickup}"
echo 'done.'å®è¡ãããšä»¥äžã«ãªãã
$ ./cdwdoc-2023-001_bashtest5.sh
2999999
========
./cdwdoc-2023-001_bashtest5.sh: line 14: /bin/echo: Argument list too long
126
0
done.ãset -eããšãset -o pipefailããçµã¿åãããã°ãäžèšã¯ä»£å ¥ã®ãšããã§ã¹ã¯ãªãããçµäºããã¯ãã§ããããŸããset -o pipefailããããŠããããset -eãã¯ããªããšããå Žåãä»£å ¥ãããŸããããªãã£ãããšãçµäºã¹ããŒã¿ã¹ã«ãã£ãŠæ€åºããã®ã¯å¯èœã§ã¯ããã
ä»£å ¥ã§ç©ºæååã«ãªãããšãã»ãã¥ãªãã£ãªã¹ã¯ã«ãªãããå Žåã«ã€ããŠã¯ããã®ã»ã¯ã·ã§ã³ã«ãŠåŸè¿°ããã
ãšããã§ãGNU Autoconfã®ããã¥ã¡ã³ãã«ãããããã«ãBashã§ãã£ãŠããset -eãã¯ç絡è©äŸ¡ã®å·ŠåŽãifæã®æ¡ä»¶å€å®ã§ã·ã§ã«é¢æ°ãåŒãã§ããæã«äºæ³ãšç°ãªãåäœã«ãªããããããªãã
以äžã¯ãããããšè©°ã蟌ãã ã®ã§ããšããããã¯æµãèªã¿ãæšå¥šã
cdwdoc-2023-001_bashtest6.shïŒ https://gitlab.com/-/snippets/2502302 )
#!/usr/bin/env bash
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
#
# see also: https://www.gnu.org/savannah-checkouts/gnu/autoconf/manual/autoconf-2.71/autoconf.html#index-set
str="$(yes 'a' | head -2999999 | tr -d '\n')"
echo "${#str}"
set -e
set -u
set -o pipefail
#set -o posix
echo '======== 1'
if /bin/echo "$str" | grep a > /dev/null ; then
echo 'FOUND(1)'
fi
echo '======== 2'
/bin/echo "$str" | grep a > /dev/null && echo 'FOUND(2)'
doit() {
echo '======== 3'
/bin/echo "$str" | wc -c
echo '======== 4'
/bin/echo "$str" > /dev/null
echo '======== 5'
pickup="$(/bin/echo "${str}x" | tr -d a)"
echo $?
echo "$pickup"
echo "${#pickup}"
}
doit || echo aaa
#doit && echo bbb # maybe puts 'bbb'
#doit # maybe 'set -e' works as expected
echo 'done.'å®è¡ãããšä»¥äžã«ãªãã
$ ./cdwdoc-2023-001_bashtest6.sh
2999999
======== 1
./cdwdoc-2023-001_bashtest6.sh: line 15: /bin/echo: Argument list too long
======== 2
./cdwdoc-2023-001_bashtest6.sh: line 20: /bin/echo: Argument list too long
======== 3
./cdwdoc-2023-001_bashtest6.sh: line 24: /bin/echo: Argument list too long
0
======== 4
./cdwdoc-2023-001_bashtest6.sh: line 27: /bin/echo: Argument list too long
======== 5
./cdwdoc-2023-001_bashtest6.sh: line 30: /bin/echo: Argument list too long
126
0
done.ãset -eããšãset -uããšãset -o pipefailãã®3ã€ã on ã«ããŠããããifæã§ã®èª€ã£ãå€å®ãç絡è©äŸ¡ã§ã®èª€ã£ãå€å®ãä»£å ¥ã§ç©ºæååã«ãªããã¿ãŒã³ããã¹ãŠãé²ããŠããªããä»£å ¥ã«ã€ããŠã¯ãä»£å ¥ãããŸããããªãã£ãããšãçµäºã¹ããŒã¿ã¹ã§æ€åºããããšèªäœã¯ã§ããŠããŠããã
è€éãªåŠçã ããããã·ã§ã«é¢æ°ã®äžã«éã蟌ããããšããããŒãºãããããã§ãset ã«é Œããªãæ¹æ³ããªããæ€èšããŠããããšã«ã¯äŸ¡å€ãããããã ã
ãšããã§Bashéå®ã®å Žåã§ããã°ãifæãªã©ã®æ¡ä»¶å€å®ãç絡è©äŸ¡ã®å·ŠåŽã§ã¯ãªãã¹ããã«ãã€ã³ã® test ïŒããã㯠[ ... ]ïŒã®ã¿ã䜿ãããã«ãããšããã®ãè¯ããããããªãããset -o pipefailããå©çšãããã£ãã倿°ã«ä»£å ¥ããããã«ããŠãéã©ããã®ã¯å¿ ãæ¯åä»£å ¥ãããŸããã£ãã®ãã©ããããã§ãã¯ãããšããæ¹éã§ããã
ãã®æ¹éã§ãããã€ãã®ã©ããã« grep ãããããšã«ãã£ãŠç©ºæååã«ãªãã®ãæ£åžžãªåŠçãšã¿ãªãå Žåãããããããªãã£ãããšããå ±åã§çµäºã¹ããŒã¿ã¹ã 1 ã«ãªã察çãšããŠãgrep aãã®ä»£ããã«ãawk '/a/'ãã䜿ã£ããã°ã«ãŒãã³ã°ã䜿ã£ãããããªã©ã®å·¥å€«ãå¿ èŠãããããªãã
cdwdoc-2023-001_bashtest7.sh ( https://gitlab.com/-/snippets/2502302 )
#!/usr/bin/env bash
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
set -o pipefail
str=$(seq 5 | grep 7 | cat) ; echo $?
str=$(seq 5 | awk '/7/' | cat) ; echo $?
str=$(seq 5 | { grep 7 ;:; } | cat) ; echo $?
str=$(seq 5 | ( grep 7 ;: ) | cat) ; echo $?å®è¡ãããšä»¥äžã®ããã«ãªãã
$ ./cdwdoc-2023-001_bashtest7.sh
1
0
0
0Bashã® PIPESTATUS ã¯ãset -o pipefailãã off ã®æã§ã䜿çšã§ãããäŸãã°ä»¥äžã®ããã«ããŠãPIPESTATUS ã«ãã£ãŠ head ã® SIGPIPE ã®äŒæå ·åã確èªã§ããã
$ set -o | grep pipefail
pipefail off
$ seq 99999999 | cat | cat | cat | head -1
1
$ echo ${PIPESTATUS[@]}
141 141 141 141 0
$ seq 99999999 | cat | { cat ;:; } | cat | head -1
1
$ echo ${PIPESTATUS[@]}
141 141 0 141 0
$ { seq 99999999 | cat | cat | cat ;:; } | head -1
1
$ echo ${PIPESTATUS[@]}
0 0å°ããããŒã¿éã§ããã° SIGPIPE ãéãããåã«ãã¹ãŠãã€ã€ããªãçµäºããŠããããšã確èªã§ãããããããªãã
$ seq 9 | cat | cat | cat | head -1
1
$ echo ${PIPESTATUS[@]}
0 0 0 0 0ä»£å ¥ãªã©ã§ã³ãã³ã眮æã䜿ãå Žåã¯ãPIPESTATUS ã§ã¯ã³ãã³ã眮æã®äžã®ãã€ãã©ã€ã³ã§èµ·ãã£ãããšãååŸã§ããªãããset -o pipefailããããŠãããªããä»£å ¥ã§ã®ã³ãã³ã眮æã®äžã®ãšã©ãŒã®æ€åºèªäœã¯å¯èœã§ããã
$ str="$(seq 99999999 | cat | cat | cat | head -1)"
$ echo ${PIPESTATUS[@]}
0
$ set -o pipefail
$ str="$(seq 99999999 | cat | cat | cat | head -1)"
$ echo ${PIPESTATUS[@]}
141POSIXã®æ©èœã ãã䜿ã£ãŠ PIPESTATUS ã«äŒŒããã®ãå®çŸããããšãã詊ã¿ã«ã€ããŠã¯ã以äžã®ãã®ãããã
return code capturing for all commands connected by "|" ... Post: 302268337
https://www.unix.com/302268337-post4.html
ãã®æ¹è¯çãšããŠãQiitaã®ä»¥äžã®èšäºïŒ2014å¹Žå ¬éïŒãããã
PIPESTATUSããããªã - Qiita
https://qiita.com/richmikan@github/items/44cbbde02bd130b2d910
ãã®æ¹è¯çã¯ãWindows/Mac/UNIX ãã¹ãŠã§20幎åãããã°ã©ã ã¯ã©ãæžãã¹ãããïŒ2016幎åïŒãšããæ¬ã«ãæ²èŒãããŠããã
ãŸãããããšã¯éãæ¹åæ§ã§ã®æ¹è¯ã®æ¡ãšããŠãQiitaã®ä»¥äžã®èšäºïŒ2020å¹Žå ¬éïŒãããã
POSIXæºæ ã·ã§ã«ã®ããã®pipefailãšPIPESTATUSã®å®è£ ïŒæ¹è¯çïŒ - Qiita
https://qiita.com/ko1nksm/items/e8309f58f91358f9f3c4
ãã¡ãã¯åè¿°ã®ãåãŸããããªã¥ãŒã ã®æç« ãç¶ç¶çã«ãã¹ããç¶ããŠãã人ããšåã人ã«ãããã®ã ããäžèšã®èšäºã¯ãã»ã©æéãå€ããªãã®ã§ããã«ã€ããŠã¯å®å¿ããŠã»ããã
ã¡ãªã¿ã«çè ã¯ããããã®ãã®è©Šã¿ã®æå¹æ§ã«ã€ããŠã¯ç¢ºèªããŠããªãã
ãšããã§ãset -o pipefailãã on ã«ããŠãããš head ããgrep -qãã SIGPIPE ãçºè¡ããããšã«æ©ãããšã«ãªãå Žåãããããããã·ã§ã«èžãã«å¹ãïŒ AWKåŠæ¹ç®ãïŒ2018幎åïŒãšããæ¬ã®P.93ã§ã¯ SIGPIPE 察çãšã㊠head ã®ä»£ããã«AWKã䜿ãäŸã玹ä»ãããŠããã
ãã®AWKã§ã®ä»£çšãå«ããŠãåºæ¬çã«ãã€ãã©ã€ã³ã®æ«å°ŸïŒãšãããã SIGPIPE ãçºè¡ããã³ãã³ãã®ç®æïŒã工倫ãããšããæ¹åæ§ã§ã¯åŠçãçµããã®ãåŸ ã€ããšã«ãªããããããããŠåŠçãçµããã®ãåŸ ã€ãšããããšã¯ãyes ããtail -fãã SIGPIPE ãåãåã察çã«ã¯äœ¿ããªããšããããšã§ããã
SIGPIPE ãåãåãåŽã§ã®ã{ ... ;:; }ãã®ãããªã°ã«ãŒãã³ã°ã®å ŽåãåŸ ã€ããšããªããšããã¡ãªããããããyes ããtail -fãã SIGPIPE ãåãåã察çã«ã䜿ããã
ãã ãã{ ... ;:; }ããšããæžãæ¹ã§ã¯ããŸããããªãããšããããäŸãã°ä»¥äžã
ãset -eãon ãã€ãset -o pipefailãon ã®æããå°ã®æãã®ãã€ãã©ã€ã³ã§ã®äœ¿çšã§ã¹ã¯ãªããïŒã·ã§ã«ïŒãçµäºããã®ãæ¢ããããšãã§ããªãã
ãset -eãon ãã€ãset -o pipefailãon ãã€ãset -o posixãon ã®æãã³ãã³ã眮æã®äžã§ã®äœ¿çšã§ã¹ã¯ãªããïŒã·ã§ã«ïŒãçµäºããã®ãæ¢ããããšãã§ããªãã
ããããããã§ãããæ±çšçãªã®ã¯ã{ ... ||:; }ããšããæžãæ¹ã§ããã
$ set -eo pipefail -o posix
$ set -o | grep -e errexit -e pipefail -e posix
errexit on
pipefail on
posix on
$ { yes ||:; } | head -3
y
y
y
$ echo still alive
still alive
$ str="$({ yes ||:; } | head -3)"
$ echo ${PIPESTATUS[@]}
0ãŸãåè¿°ã®ããã«ããã«ãã€ã³ã® echo ã printf ã«ã€ããŠã¯ã{ ... ;:; }ããã{ ... ||:; }ãã®ãããªã°ã«ãŒãã³ã°ã¯å¹ããªããããããªãã®ã ããã©ãããŠã printf ãå¿ èŠãªæãªã©ãããããããš cat ãããŸããããšã«ãã£ãŠããŸãããããšããããããããªãã
$ str="$(yes 'a' | head -2999999)"
$ { printf '%s\n' "$str" ||:; } | head -1
a
$ echo ${PIPESTATUS[@]}
141 0
$ set -eo pipefail -o posix
$ set -o | grep -e errexit -e pipefail -e posix
errexit on
pipefail on
posix on
$ { printf '%s\n' "$str" | cat ||:; } | head -1
a
$ echo ${PIPESTATUS[@]}
0 0ã¡ãªã¿ã«ã{ ... ;:; }ããã{ ... ||:; }ãã¯å€ãBashã§ã䜿ããã以äžã¯Knoppix 3.2ïŒ2003幎ãªãªãŒã¹ïŒã® bash 2.05b.0ïŒ2002幎ãªãªãŒã¹ïŒã§è©Šãããã®ã§ããããã®é ã®Bashã«ã¯ PIPESTATUS ã¯ããããset -o pipefailãã¯ãªãã
knoppix@ttyp0[knoppix]$ seq 99999999 | head -1
1
knoppix@ttyp0[knoppix]$ echo ${PIPESTATUS[@]}
141 0
knoppix@ttyp0[knoppix]$ { seq 99999999 ;:; } | head -1
1
knoppix@ttyp0[knoppix]$ echo ${PIPESTATUS[@]}
0 0
knoppix@ttyp0[knoppix]$ set -o pipefail
bash: set: pipefail: invalid option name
knoppix@ttyp0[knoppix]$ echo $BASH_VERSION
2.05b.0(1)-release
knoppix@ttyp0[knoppix]$ uname -a
Linux Knoppix 2.4.21-xfs #1 SMP Fre Jul 25 00:06:47 CEST 2003 i686 GNU/Linuxåœç¶ãªãããã{ ... ;:; }ãã®ãããªã°ã«ãŒãã³ã°ã®äœ¿çšã¯ãArgument list too longãã®ãããªéèŠãªãšã©ãŒã«ã€ããŠãæ€åºããæ©äŒã奪ããããé»éè¡çãªèŠçŽ ãããããšã«ã¯çæããå¿ èŠãããã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ seq 9 | cat | grep "$str" | cat | cat
bash: /usr/bin/grep: Argument list too long
$ echo ${PIPESTATUS[@]}
0 0 126 0 0
$ seq 9 | cat | { grep "$str" ;:; } | cat | cat
bash: /usr/bin/grep: Argument list too long
$ echo ${PIPESTATUS[@]}
0 0 0 0 0ã
BusyBoxãšããäžæè°ãªååš
ã³ã³ãã¥ãŒã¿ã®æŽå²äžã«ãããŠã¯ããŸã GPLã®ãããªãã®ãæ³çã«ææåãæã€ã®ãææ§ã ã£ãææã«GPL蚎èšã§åå©ããããšã§ãæåãªBusyBoxã
ãã®ã»ã¯ã·ã§ã³ã¯BusyBoxã«èå³ããªããã°èªã¿é£ã°ããŠããã£ãŠãããŸããªãã
Ubuntuãã¯ãããšããŠãDebianç³»ã§ã¯çŽ çŽã«ã€ã³ã¹ããŒã«ããã°æåãã /bin/busybox ãå ¥ã£ãŠããã
Ubuntu 22.04.1ãLubuntu 22.04.1ãUbuntu 22.10ãKnoppix 9.1ãªã©ã«ãããŠã¯ãbusybox ããã±ãŒãžã®ã»ãã§ã¯ãªã busybox-static ããã±ãŒãžã«ããã¹ã¿ãã£ãã¯ãã€ããªã® busybox ãæåããå ¥ã£ãŠãããããããªãã
$ dpkg -S /bin/busybox
busybox-static: /bin/busybox
$ ldd /bin/busybox
not a dynamic executable
$ dpkg -l | grep busybox-static
ii busybox-static 1:1.30.1-7ubuntu3 amd64 Standalone rescue shell with tons of builtin utilitiesãŸããFedora 37 Workstationã§ãsudo yum install busyboxããããã¯ãsudo dnf install busyboxãã§BusyBoxãå ¥ãããšããã¡ããã¹ã¿ãã£ãã¯ãã€ããªã® busybox ãå ¥ãã
$ rpm -qf /usr/sbin/busybox
busybox-1.36.0-1.fc37.x86_64
$ ldd /usr/sbin/busybox
not a dynamic executableDebian系㮠busybox-static ããã±ãŒãžã® busybox ã¯ãåã«ã¹ã¿ãã£ãã¯ãã€ããªãšããã ãã§ã¯ãªãããbusybox shãã§å¯Ÿè©±çã«ã·ã§ã«ãå©çšããäžã§äŸãã°ãtype dirnameããšã¿ã€ããããšãdirname is dirnameããšããåºåãåŸãããã
$ busybox sh
BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ $ type dirname
dirname is dirnamestrace ã«ãã£ãŠãdirname aããå®è¡ããæã®æ§åãèŠããšã/usr/bin/dirname ãå®è¡ãã圢跡ããªããexecve(2) ã¯1åã ãã ã
$ strace busybox sh -c 'dirname a' 2>&1 | grep dirname
execve("/usr/bin/busybox", ["busybox", "sh", "-c", "dirname a"], 0x7fffb6bb65f8 /* 62 vars */) = 0
prctl(PR_SET_NAME, "dirname") = 0Debian 11.6ã§æåããå ¥ã£ãŠãã busybox ããã±ãŒãžã®ã»ãã® busybox ã§ã¯ä»¥äžã®ããã«ãªãã確ãã« execve(2) ã2åãããéã£ãŠãããã¹ããæ¢çŽ¢ãã/usr/bin/dirname ãå®è¡ããŠããã
$ strace busybox sh -c 'dirname a' 2>&1 | grep dirname
execve("/usr/bin/busybox", ["busybox", "sh", "-c", "dirname a"], 0x7fffb8312538 /* 39 vars */) = 0
stat("/usr/local/bin/dirname", 0x7ffea1cd2f58) = -1 ENOENT (No such file or directory)
stat("/usr/bin/dirname", {st_mode=S_IFREG|0755, st_size=39712, ...}) = 0
execve("/usr/bin/dirname", ["dirname", "a"], 0x555706142a98 /* 39 vars */) = 0Fedora 37 Workstationã§ãsudo yum install busyboxãã§å ¥ã£ã busybox ã§ã¯ä»¥äžã®ããã«ãªãããã¡ãã execve(2) ã2åããã
$ strace busybox sh -c 'dirname a' 2>&1 | grep dirname
execve("/usr/sbin/busybox", ["busybox", "sh", "-c", "dirname a"], 0x7fff64f6c388 /* 43 vars */) = 0
stat("/home/user1/.local/bin/dirname", 0x7fff19bbc880) = -1 ENOENT (No such file or directory)
stat("/home/user1/bin/dirname", 0x7fff19bbc880) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/dirname", 0x7fff19bbc880) = -1 ENOENT (No such file or directory)
stat("/usr/local/sbin/dirname", 0x7fff19bbc880) = -1 ENOENT (No such file or directory)
stat("/usr/bin/dirname", {st_mode=S_IFREG|0755, st_size=33264, ...}) = 0
execve("/usr/bin/dirname", ["dirname", "a"], 0x7ff71f1b6af8 /* 43 vars */) = 0Debian系㮠busybox-static ããã±ãŒãžã® busybox ã§ dirname ããdirname is dirnameãã§ãããããªå Žåãdirname ã¯ãŸãã§ãã«ãã€ã³ã§ãããã®ããã«ãArgument list too longãã®å¶éãååšããŠããªãããã«ã¿ããããšãããã
$ busybox sh
BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ $ str="$(yes 'aaa/' | head -999999 | tr -d '\n')"
~ $ dirname "$str" | wc -c
3999992
~ $ type dirname
dirname is dirnameãããŠæè¿ã®BusyBoxãªããexpr ããexpr is exprãã§ãããããªå Žåã«ãå·šå€§ãªæååã®æ£èŠè¡šçŸãããã³ã°ãäºå®äžã®ãã«ãã€ã³ãšããŠå©çšã§ãããããããªãã
$ busybox sh
BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ $ str="$(yes 'a' | head -9999999 | tr -d '\n')"
~ $ expr "$str" : 'a.*'
9999999
~ $ type expr
expr is exprãã ããã«ãã€ã³ã®ããã«ã¿ããå Žåã§ãããã€ã§ãå®å¿ãšããããã§ã¯ãªãã
grep ããgrep is grepããªå Žåã§ãã£ãŠãããŸãã§å€éšã³ãã³ãã®ããã«ãArgument list too longããåºããããããªãã
$ busybox sh
BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ $ str="$(yes 'a' | head -131071 | tr -d '\n')"
~ $ echo | grep "$str"
~ $ echo | grep "^$str"
sh: grep: Argument list too long
~ $ type grep
grep is grepwget ãããã¯ãå€éšã³ãã³ãã®ããã«ãArgument list too longããåºãã
$ busybox sh
BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ $ str="$(yes 'a' | head -999999 | tr -d '\n')"
~ $ wget "$str"
sh: wget: Argument list too long
~ $ type wget
wget is wgetãŸãã巚倧ãªå€æ°ãçæããããšããã®å€æ°ãšã¯ç¡é¢ä¿ãªã¯ãã®ããåãããªãã¿ã€ãã³ã°ã§ãArgument list too longããåºãããã«ãªãããšãããã
$ busybox sh
BusyBox v1.30.1 (Ubuntu 1:1.30.1-7ubuntu3) built-in shell (ash)
Enter 'help' for a list of built-in commands.
~ $ rm aaa.txt 2> /dev/null
~ $ echo aaa > aaa.txt
~ $ str="$(yes 'aaa/' | head -999999 | tr -d '\n')"
~ $ dirname "$str" > /dev/null
~ $ cat aaa.txt | wc -c
sh: cat: Argument list too long
sh: wc: Argument list too longãªããäžèšãšåãããšãã¹ã¯ãªãããšããŠå®è¡ãããšBusyBoxã¯ãArgument list too longããåºããªãã
$ cat busyboxtest.sh
#!/bin/busybox sh
rm aaa.txt 2> /dev/null
echo aaa > aaa.txt
str="$(yes 'aaa/' | head -999999 | tr -d '\n')"
dirname "$str" > /dev/null
cat aaa.txt | wc -c
$ ./busyboxtest.sh
4
$ cat ./busyboxtest.sh | busybox sh
4
$ cat ./busyboxtest.sh | bash
bash: line 6: /usr/bin/dirname: Argument list too long
4ãããããŠã¹ã¯ãªãããšããŠå®è¡ããã° grep ã wget ããArgument list too longããåºããªãã®ã§ã¯ïŒãªã©ãšèããŠã¿ãŠããããã¯ãã£ã±ãåºããšãããããã銬ã¶ãã
$ cat busyboxtest2.sh
#!/bin/busybox sh
str="$(yes 'a' | head -999999 | tr -d '\n')"
echo | grep "$str"
wget "$str" -q -O - > /dev/null
$ ./busyboxtest2.sh
./busyboxtest2.sh: line 5: grep: Argument list too long
./busyboxtest2.sh: line 6: wget: Argument list too long
$ cat ./busyboxtest2.sh | busybox sh
sh: grep: Argument list too long
sh: wget: Argument list too longãªããDebian系㮠busybox-static ããã±ãŒãžã® busybox ã§ã¯ãgrep ã wget ã®éã« /proc/self/exe ã§èªåèªèº«ãèµ·åããŠããããšã確èªã§ããã
$ strace busybox sh -c 'dirname a' 2>&1 | grep exec
execve("/usr/bin/busybox", ["busybox", "sh", "-c", "dirname a"], 0x7ffdbe68b5c8 /* 63 vars */) = 0
$ strace busybox sh -c 'expr a : a' 2>&1 | grep exec
execve("/usr/bin/busybox", ["busybox", "sh", "-c", "expr a : a"], 0x7ffff5265818 /* 63 vars */) = 0
$ strace busybox sh -c 'grep a < /dev/null' 2>&1 | grep exec
execve("/usr/bin/busybox", ["busybox", "sh", "-c", "grep a < /dev/null"], 0x7ffca3063508 /* 63 vars */) = 0
execve("/proc/self/exe", ["grep", "a"], 0x235e3d8 /* 63 vars */) = 0
$ strace busybox sh -c 'wget http://localhost:8080/' 2>&1 | grep exec
execve("/usr/bin/busybox", ["busybox", "sh", "-c", "wget http://localhost:8080/"], 0x7ffc5ab2f948 /* 63 vars */) = 0
execve("/proc/self/exe", ["wget", "http://localhost:8080/"], 0x23ca3b8 /* 63 vars */) = 0execve(2) ã« /proc/self/exe ãæž¡ãã®ã§ã¯ãªããclone(2) ã®ããšãããããã ã
$ strace busybox sh -c 'grep a < /dev/null ; true' 2>&1 | grep -e exec -e clone
execve("/usr/bin/busybox", ["busybox", "sh", "-c", "grep a < /dev/null ; true"], 0x7ffec3802898 /* 63 vars */) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x125d690) = 66268
$ strace busybox sh -c 'wget http://localhost:8080/ ; true' 2>&1 | grep -e exec -e clone
execve("/usr/bin/busybox", ["busybox", "sh", "-c", "wget http://localhost:8080/ ; tr"...], 0x7ffc839579c8 /* 63 vars */) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x24ae690) = 66275ä»åçè ã確èªãã busybox-static ããã±ãŒãžã®ããŒãžã§ã³ã¯ãããã以äžã®ãšããã§ããã
Ubuntu 22.04.1ããã³Lubuntu 22.04.1 : 1:1.30.1-7ubuntu3
Ubuntu 22.10 : 1:1.35.0-1ubuntu1
Knoppix 9.1 : 1:1.30.1-6+b1
ã
ã·ã§ã«ã¹ã¯ãªãã以å€ã®èšèªã«ãããALTLãªãŒããŒãããŒ
ã·ã§ã«ã¹ã¯ãªãã以å€ã®èšèªã®ããšãèããŠã¿ãããããããããšã«ãã£ãŠããèŠããŠããªãããšãããã
ã ããã®åã«ãè¿å¹Žã·ã§ã«ã¹ã¯ãªããããããç¶æ³ã倧ããå€åããŠããããšã«ã€ããŠã
ã·ã§ã«ã¯ããšããšç¹æ®ãªååšã§ãããåºæ¬çã«ã¯ãªãŒãã³ãœãŒã¹ã®ãšã³ã·ã¹ãã ã®äžéšãšèããŠãããããªãŒãã³ãœãŒã¹é©åœãèµ·ããåã«æ¢æäºå®åããŠããŸã£ãŠããã
1990幎代åŸåã®ãªãŒãã³ãœãŒã¹é©åœã¯ãLinuxã®æåãPerlã®æåãšåŒ·ãçµã³ã€ããŠããã
ãªãŒãã³ãœãŒã¹ãããŠã¯ã2ã€ã®ã5ããŒã»ã³ãããéèŠã ãšçè ã¯èããŠããã
1ã€ç®ã®ã5ããŒã»ã³ããã¯ããããããã5ããŒã»ã³ãã«ãŒã«ããã€ãŸã5ããŒã»ã³ãã®ææçãŠãŒã¶ãŒãæ®ã95ããŒã»ã³ãã®ç¡æçãŠãŒã¶ãŒãæ¯ããŠãããšãããã®ã ã
OSSã®å Žåãç¹ã«ãã®ãŸãŸWebãµãŒãã¹ãšããŠã®ãµãŒãã¹æäŸãšãã圢ããšãã«ãããããªãé åžã®ã¿ããåæã«ãããœãããŠã§ã¢ã§ã¯ããããããææçãã®ãããªãã®ããªãå Žåãå€ãããããããšå¯ä»ããã人ãšå¯ä»ãããªã人ãšããåãæ¹ããã§ããªããããããªãã
ããã ãš5ããŒã»ã³ãã§ã¯ãªã1ããŒã»ã³ããããã§ã¯ãªããããšãããããã§ã¯ããããå€§äŒæ¥ãå¯ä»ããããããããšãããããã®å Žåã¯ãã®äŒæ¥ã®åŸæ¥å¡ãããã®äŒæ¥ã®ãµãŒãã¹ããããã¯ãã«ãéãæã£ãŠãã人ã ã鿥çã«æ¯æŽãããŠããããšã«ãªãã
ãã1ã€ã®ã5ããŒã»ã³ããã¯ãæåãªOSSãPDSã®ãããžã§ã¯ãã«ããããã³ãŒããæžãã人ã ã®äžã®ãããã5ããŒã»ã³ããã ããçžæã«éçºãé²ãããããšããã¡ãªããã§ããã
ãã®ãããæ°ã®è³æ Œãæã£ãŠãããã©å®ã¯ã³ãŒããæžããªãããšã³ãžãã¢ãã«ç¡çããä»äºãå²ãåœãŠãå¿ èŠã¯ãªãããã³ãŒããæžããªã圹å¡ãæ¿æ²»çã«æ±ºãããæ°æ©èœãããã蟌ãã§ãããšãããããªããšãåºæ¬çã«ã¯èµ·ããã«ãããç®èãªããšã«ã巚倧ã§ãã©ã³ãåãæã£ãäŒæ¥ã«ããããã£ãããšãèµ·ãããããã
OSSã®éçºè ããç§éã¯ããã5ããŒã»ã³ãã§ãïŒããªã©ãšèªç§°ããããšã¯åºæ¬çã«ã¯ãªãããå¶å©äŒæ¥ã¯ããã¡ã®äŒç€Ÿãããã«ãããæè¡è ãæããŠãããããã¢ããŒã«ãããããäžéäžè¬ã§ã¯éã®ã€ã¡ãŒãžãæãããŠããŸãããšãå€ãã
æåãªOSSãPDSã§ãã°ãçºèŠãããšå€§ããªãã¥ãŒã¹ã«ãªã£ããããããããããæåãªOSSãPDSã®ã³ãŒããšããã®ã¯ããã5ããŒã»ã³ãã®äººãæžããç¹æ®ãªãã®ãšèããã»ããããã®ã§ããã
ãããã£ããã¥ãŒã¹ã®è£ã§ã¯ã決ããŠè¡šã«ã¯åºãŠããªããããªãæ³åãçµ¶ããã»ã©ã²ã©ãã³ãŒããæ¥ã çæããç¶ããŠããã®ã§ãããããã衚ã«åºãŠããªãã³ãŒããšããã®ã¯ããŸãã«è¡šã«åºãŠããªããããã«ãç§åŠãšãããŸãªæ¿ã®äžã«ä¹ããããšã¯äžå¯èœã§ããã
ãœãŒã¹ã³ãŒããå ¬éãããŠãããšããããšã¯ããã€ã§ã誰ã§ã誰ã®èš±å¯ãåŸãããšããªãæ€èšŒã§ãããšããèªç±ïŒããªãŒã»ãã©ã€ã¹ã§ã¯ãªãããªãŒãã ïŒãããããã®ããšã¯ã¯ãªãªãã£ã®åäžãç¶æã«è²¢ç®ãããããšãããŠããã
ãã€ã§ã誰ã§ãæ€èšŒã§ãããšããããšãããœãããŠã§ã¢ãšããŠã®ã¯ãªãªãã£ãšã¯éãåŽé¢ããéèŠèŠãããããšãããã
ãªã©ã€ãªãŒããåºãŠããããã€ãªã€ã³ãã©ããã£ã¯ã¹ããŒã¿ã¹ãã«ââãªãŒãã³ãœãŒã¹ããŒã«ã䜿ã£ãããã¹ãã§åçŸæ§ã®ããç ç©¶ãïŒéŠèš³ã¯2020幎åãåèã¯2015幎åïŒã®ç¬¬1ç« ã¯ãã·ã§ã«ã¹ã¯ãªããã«ããšãããããããã°ã©ãã³ã°èªäœã«ããŸãèå³ããªã人ã«ãšã£ãŠãèªã¿ç©çãªé¢çœããããã®ã§ã¯ãªãã ãããã
ã©ã®ããŒã«ã®ã©ã®ããŒãžã§ã³ãã©ããªé¢šã«å©çšããŠããããçµæãåŸãããã®ããšããããšãããã¥ã¡ã³ããšããŠæ®ãããŠããªãããšããç ç©¶çµæã®èª€ããèŠéããŠããŸãèŠå ã«ãªããšåæã«ãä»äººãç ç©¶å å®¹ãæ€èšŒããæã®è¶³ããã«ããªãããšã玹ä»ãããŠããã®ã§ããã
ãã€ãªã€ã³ãã©ããã£ã¯ã¹ã¯å»çãšéãªãé åã§ãããã®ã§ãããã¯ãã¯ã瀟äŒåé¡ã«ãªã£ãŠãããšãã£ãŠãããã
ãã®æ¬ã®ç¬¬1ç« ã®ã1.7.7 ããŒã¿ãèªã¿åãå°çšãšããŠæ±ãããã1.8.4 ã³ãŒããããã¥ã¡ã³ããšããŠäœ¿çšãããã§ã¯ãå ã®ããŒã¿ãçŽæ¥å€æŽãããããªãã©ãã¯ããã¯ã¹åããããExcelã䜿ã£ãäœæ¥ããç§åŠç ç©¶ã«ã倧ããªåœ±ãèœãšããŠãããç°¡æœãªèšè¿°ãå¯èœãªã·ã§ã«ã¹ã¯ãªããã®ã³ãŒããã®ãã®ãããã¥ã¡ã³ããšããŠå©çšããããšããããŒãºãããããšãåãããå ã®ããŒã¿ã¯å ã®ããŒã¿ãšããŠæ®ããŠãããã·ã§ã«ã¹ã¯ãªããã®ã³ãŒããšããã«ä»éããç°å¢æ å ±ã«ãã£ãŠãããšãã誰ã詊ããŠãåãçµæãåºåãããããã«ãããããã ã
2016幎ã«ã¯ãéºäŒåç ç©¶ã®3597ä»¶ã®çºè¡šæžã¿è«æã粟æ»ããçµæããã®çŽ5åã®1ãã®è«æã«Excelã®ãããªè¡šèšç®ãœããç¹æã®ãšã©ãŒã®çè·¡ããã£ããšãã調æ»ã話é¡ã«ãªã£ãããããã
ExcelãéºäŒåç ç©¶ã®èª€ãã®ããšã«ãªã£ãŠãããšç ç©¶è ãææ - GIGAZINE
https://gigazine.net/news/20160829-excel-gene-name-error/
ããã€ãªã€ã³ãã©ããã£ã¯ã¹ããŒã¿ã¹ãã«ãã®ã1.4 åçŸå¯èœãªç ç©¶ãã«ã¯ä»¥äžã®ãããªç®æãããïŒP.9ïŒã
æ®å¿µãªãããã»ãšãã©ã®ã·ãŒã¯ãšã³ã·ã³ã°å®éšã¯è©Šéšç®¡ã®æ®µéããåçŸããã«ã¯è²»çšãããããããããã«ãç§ãã¡ã¯ãŸããŸãâèšç®æ©å ã§ã®åçŸâïŒin silico reproducibilityïŒã ãã«é Œãããšãå€ããªã£ãŠããã
ããã«ã以äžã®ãããªç®æãããïŒP.9ïŒã
ãã£ãŠãèšç®æ©å ã§ã®åçŸã容æã«ãä¿é²ããããšã¯ãåªããç§åŠè ãšããŠã®è²¬åãªã®ã ã
ããããããšãã責åãã ãšãšãããããããšããããšããã®ã¯ãéçºçŸå Žã®ããã°ã©ããŒãå«ããå€ãã®äººã ãã€ã¡ãŒãžãããããªãçç©åŠãããã¯ãããªãããé¢ããŠããã®ã§ã¯ãªãã ãããã
ãããŠãµãã¿ã€ãã«ã«ããããã«ãã·ã§ã«ã¹ã¯ãªããã«ããã¹ããã¹ïŒå ç¢æ§ïŒãæåŸ ãããŠããã®ã§ããã
ãŸã2015幎ã«ã¯åãããªã©ã€ãªãŒãããã³ãã³ãã©ã€ã³ã§ã¯ãããããŒã¿ãµã€ãšã³ã¹ââåæããã»ã¹ãèªåšã«é²ãããã¯ããã¯ããåè¡ãããŠããïŒç¬¬1çã®åèã¯2014幎åïŒããã¡ãã®æ¬ã«ã€ããŠã¯ãäœè ã®2013幎ã®ããã°èšäºã1åã®æ¬ã«èšããŸããããšããããšããã¹ã¿ãŒãããããã ããã®ããã°èšäºã¯ä»¥äžã§èªããã
7 Command-Line Tools for Data Science
https://jeroenjanssens.com/seven/
ãã®æ¬ã®ã1.5.5 ã³ãã³ãã©ã€ã³ã¯æ®éçãã§ã¯ããTOP 500 Supercomputerããšãããµã€ãã«ãããã®ãšããŠã以äžã®ãããªèšè¿°ãããïŒP.10ïŒã
ããã500ã«å ¥ãã¹ãŒããŒã³ã³ãã¥ãŒã¿ã®95%ã¯GNU/Linuxãå®è¡ããŠããããã§ãã
è¯ãããšãªã®ãã©ããã¯åãããªããã2023幎3æçŸåšã¯Linuxãä»ãé§éããŠããŸã£ãããã ã以äžã®ããŒãžã§ãCategoryãããOperating system Familyãã«ããŠçµ±èšã衚瀺ãããšãããæ°å¹Žã§ãLinuxãã100ïŒ ã«ãªã£ãããšãåããã
Development over Time | TOP500
https://www.top500.org/statistics/overtime/
ä»ãšãªã£ãŠã¯ãã¹ãŒããŒã³ã³ãã¥ãŒã¿ ïŒ Linuxãã·ã³ããªã®ã ã
ãããŠãããã£ãç¶æ³äžã§ããã€ãªã€ã³ãã©ããã£ã¯ã¹ãããŒã¿ãµã€ãšã³ã¹ã«ãããŠBashãGNU coreutilsãç ç©¶ã«æŽ»çšããããšããåããããããã ã
ã·ã§ã«ã¹ã¯ãªãããšããã°ãã€ã³ãã©ãããã·ã¹ãã ã¹ã¯ãªãããã ããšãã飿³ã«ãªãã®ã¯1990幎代åŸåã®ãã®ã§ãã£ãŠãæã®ç¶æ³ããã¯ãŸã£ããæ³åã ã«ããªãæ¹é¢ããã®æåŸ ããããšãããããªã®ã§ããã
ã¡ãªã¿ã«ãã³ãã³ãã©ã€ã³ã§ã¯ãããããŒã¿ãµã€ãšã³ã¹ãã®éŠèš³ã¯250ããŒãžåŒ±ãšã³ã³ãã¯ãã§ãã·ã§ã«ã¹ã¯ãªãããã®ãã®ã«ã€ããŠã¯ã詳解ã·ã§ã«ã¹ã¯ãªãããïŒéŠèš³ã¯2006幎åãåèã¯2005幎åãåé¡ã¯ãClassic Shell ScriptingãïŒãèªããã第4ç« ã«ãŠæšå¥šãããŠããã
äžæ¹ãããã€ãªã€ã³ãã©ããã£ã¯ã¹ããŒã¿ã¹ãã«ãã®ã»ãã¯500ããŒãžãè¶ ããããªã¥ãŒã ã§ããã€ãªæ¹é¢ãããŒã¿ãµã€ãšã³ã¹ã«èå³ããªã人ã«ãšã£ãŠã瀺åçãªããšããããããšæžãããŠããã
ãããŠãã®æ¬ã§ã¯ãã·ã§ã«ã¹ã¯ãªããã§æžãã°ããã¹ãã«ãªãããªã©ãšäž»åŒµããŠããããã§ã¯ãªãã以äžã¯P.424ïŒç¬¬12ç« ïŒããã
æ®å¿µãªãããBashã¯è匱ãªèšèªã§ãããããããã€ãªã€ã³ãã©ããã£ã¯ã¹ã§å®å šã«äœ¿çšããããã«ã¯ãããã€ãã®å¥åŠãªæ¯ãèãã«æ°ãã€ããå¿ èŠãããã
ã·ã§ã«ã¹ã¯ãªããã®å©äŸ¿æ§ã掻ããã€ã€ããã¹ãã§ããããã«ã¯ã³ããå¿ èŠã§ããããšèšã£ãŠããã®ã§ããã
ã¡ãªã¿ã«äžèšã®åŒçšç®æã¯ãset -eãããset -uãããset -o pipefailãã«ã€ããŠã®è§£èª¬ã®ç®æã§ããããããŠããã3ã€ããæåã®é²æ³¢å €ããšè¡šçŸããŠããã
ãšããã§ãåçŸæ§ãšããããšã§ãããšåè¿°ã®ããã«Knoppixã®isoã€ã¡ãŒãžãã¡ã€ã«ã®ãããªãã®ã¯éåžžã«åŒ·åã§ã¯ããããæ®å¿µãªãããã€ãªã€ã³ãã©ããã£ã¯ã¹ãããŒã¿ãµã€ãšã³ã¹ã§ã¯åºæ¬çãªUnixããŒã«ã»ããã ãã䜿ãããšããçºæ³ã§ã¯ãªãããã ããã€ãªåãã»ããŒã¿ãµã€ãšã³ã¹åãã®æ§ã ãªäŸ¿å©ãªããŒã«ãã³ãã³ãã©ã€ã³ã®ããŒã«ãšããŠæäŸãããŠããããããããã®å é²çãªããŒã«ãGNU coreutilsã®ããŒã«çŸ€ãšçµã¿åãããŠäœ¿ããããšããã®ãã¡ã€ã³ã®ããã§ããã
ã¡ãªã¿ã«ããã€ãªã€ã³ãã©ããã£ã¯ã¹ããŒã¿ã¹ãã«ãã§ã¯éºäŒåé åã察象ã«ããBioawkãªããŠãã®ã玹ä»ãããŠããããããããã¯The One True AWKãæ¡åŒµããŠãã€ãªæ¹é¢ã§ãã䜿ãããããŒã¿åœ¢åŒãæ±ãããããããã®ã§ããã
The One True AWKã«ã€ããŠã¯ãå»å¹ŽïŒ2022幎ïŒã«ãªã£ãŠããèšèšè ã®1人ã§ãããã©ã€ã¢ã³ã»ã«ãŒããã³èªèº«ã®æã«ãã£ãŠUnicodeã®ãµããŒããæžãããããããããããã¯ãæžããã€ã€ããããšããã®ãæ£ç¢ºãªãšãããããããªãã
éçºãã 45 幎ãããã°ã©ãã³ã°èšèª AWK ã« Unicode ãµããŒãã远å | ã¹ã©ã ããããããŒ
https://developers.srad.jp/story/22/08/25/1358226/
ãã¹ãçšã®ããŒã¿ã®äžã«ã¯ããã¹ãŠã®å人ã®ããã«ãããä»ããã®æã ããªã©ã®æ¥æ¬èªãããã
https://github.com/onetrueawk/awk/blob/d322b2b5fc16484affb09e86b044596a2e347853/testdir/T.utf
ãšãªãã¯ã»ã¬ã€ã¢ã³ãã®ãThe Art of UNIX ProgrammingãïŒéŠèš³ã¯2007幎åãåèã¯2003幎åïŒã§ã¯AWKãå®å šã«ãçµãã£ãååšããšããŠæ±ã£ãŠããŸã£ãŠãããããããåºæ¬çã«ã¯1990幎代åŸåã®ç©ºæ°ãåæ ããããã®ã§ãããåæã¯ä»¥äžã®URLã§èªããã
The Art of Unix Programming - Case Study: awk
http://www.catb.org/~esr/writings/taoup/html/ch08s02.html#awk
ããããã°ãPerlãRubyã¯ããããªæå³ã§AWKã®åœ±é¿ãåããŠããããããŠRubyã®äœè ã¯ã·ã§ã«ã¹ã¯ãªãããžã®äžæºãRubyã®èšèšã«åœ±é¿ãäžããŠãããšç€ºåããŠããã
PerlãRubyãPythonã¯è¯ããæªããèšèªèšèšè ã®å¥œã¿ãæ¿åãã€ç¶ç¶çã«åæ ããç¶ããŠããããã·ã§ã«ã«ã€ããŠã¯èšèªèšèšè ã®èŠç¹ãããŸãç¶ç¶çã«ã¯åæ ãããªããŸãŸæ¢æäºå®åããŠããŸã£ãã
2018幎ããããã¯ãäºææ§ãæŸæ£ããã·ã§ã«ã®fish shellãElvishã話é¡ã«ãªã£ãŠãããèšèªèšèšè ã®èŠç¹ãæã¡èŸŒãŸãå§ããŠãããšãããã®ãããããªãã
ã¡ãªã¿ã« fish ã«ããããŒãžã§ã³3.1b1ïŒ2020幎ãªãªãŒã¹ïŒããã¯Bashã® PIPESTATUS ã«äŒŒã $pipestatus ãããããããŠã{ ... ;:; }ããšããã°ã«ãŒãã³ã°ã®æžãæ¹ã¯ã§ããªãã begin ãš end ã䜿ã£ãŠäŒŒãããšãã§ããããã ã
以äžã¯GhostBSD 22.06.18ã®fish 3.4.1ã§è©Šãããã®ã以äžã¯çºããã ããæšå¥šã
> jot 99999999 | cat | cat | cat | head -1
1
> echo $pipestatus
141 141 141 141 0
> jot 99999999 | cat | { cat ;:; } | cat | head -1
fish: Unknown command: '{ cat ;:; }'
fish: '{ ... }' is not supported for grouping commands. Please use 'begin; ...; end'
jot 99999999 | cat | { cat ;:; } | cat | head -1
^
> jot 99999999 | cat | begin; cat ;:; end | cat | head -1
1
> echo $pipestatus
141 141 0 141 0
> echo $FISH_VERSION
3.4.1
> uname -a
FreeBSD vm1 13.1-STABLE FreeBSD 13.1-STABLE GENERIC amd64fish ã§ã¯ä»£å ¥ã§ãstr=ãã®ãããªåœ¢åŒã§ã¯ãªã set ã䜿ãããããŠfish 3.2.0ïŒ2021幎ãªãªãŒã¹ïŒãã㯠set ã«ãã£ãŠ $pipestatus ãäžæžããããªããããä»£å ¥ã§ã³ãã³ã眮æã䜿çšããæããããšããã³ãã³ã眮æã®äžã®ãã€ãã©ã€ã³ã§èµ·ãã£ãããšãååŸã§ããã
> set str (jot 99999999 | cat | begin; cat ;:; end | cat | head -5)
> echo $pipestatus
141 141 0 141 0
> echo "$str"
1 2 3 4 5çè ã«ããäºææ§ãæŸæ£ããã·ã§ã«ã®æ§æ³ã10幎以äžåããããã
ãããŠãã®æ§æ³ã¯AWKã®ä»æ§ãšæ·±ãé¢é£ãããã
ãã®èšäºã§è¿°ã¹ãŠãããããªãã®ãå«ããæ¢åã®ã·ã§ã«ã«ããã匱ç¹ãå æãããã®ãšããæ¹åãšã¯ãŸãéãã¢ã€ãã£ã¢ãããããããå®çŸããããšãããšçµå±ã·ã§ã«ã¯AWKã®æ©èœãåã蟌ãŸãããåŸãªãã®ã§ããã
AWKã®æ¹è¯çã®æ§æ³ãç·Žã£ãŠããææããã£ãã®ã ããçµå±ãã®ãã·ã§ã«ãAWKã®æ©èœãåã蟌ãã§ããã®ããAWKãã·ã§ã«åããŠããã®ããã®åºå¥ãã€ããªããªãããšã«æ°ã¥ããŠãããåãããªããªã£ãã
AWKãå«ããåºã䜿ãããŠããã¹ã¯ãªããèšèªãšæ¯èŒããŠã¿ããšãã·ã§ã«ã®å Žåã¯äœããããŸããæ¡ä»¶å€å®ãç¹æ®ãªããšã¯æããã ã
ifæãªã©ãç絡è©äŸ¡ã§ã¯ãçµäºã¹ããŒã¿ã¹ãèŠãŠå€å®ããã
ãããŠçµäºã¹ããŒã¿ã¹ã 0 ã®æã ããtruthyã0 以å€ã¯falsyã
ã·ã§ã«ãªãã ãããããããã®ãªã®ã ãšèšã£ãŠããŸãã°ãããŸã§ã ããæå³è«çã«ã¯é倧ã ã
ããã¯ã€ãŸããéåžžã®ifæãç絡è©äŸ¡ããšã©ãŒãã³ããªã³ã°ãšããŠã®æ§è³ªãæã£ãŠããŸã£ãŠããã®ã§ããã
grep ã®ããã«ãçµäºã¹ããŒã¿ã¹ã«ãã£ãŠãããããã»ãããããªãã£ããšããæ å ±ãäŒéããããšããã³ãã³ããåºæ¬çãªãã®ãšããŠååšããŠããããšããŸãæ··ä¹±ã®å ã ã
ããã«ãset -o pipefailããæã¡èŸŒããšãgrep ã®ããããããªãã£ãããšããæ¥µããŠæ¥åžžçãªãå ±åããšãSIGPIPE ãåãåããšãããããªããããæ¥åžžçã«çºçãããã®ãšããArgument list too longãã®ãããªã»ãã¥ãªãã£ã®äŸµå®³ãç®çãšããæå³ããããããããªããããªé倧ãªãšã©ãŒãååã«ãªããšããæ°ããåé¡ãçãŸããã
çµå±ãã¬ãŒãç¯ã®ifæã«ãããŠã; then :; elseãã®ãããªãã®ã䜿ããšãã¬ãŒãç¯ã®ç絡è©äŸ¡ã§ã¯ && ã§ã¯ãªã || ã䜿ããšããå€éšããã°ã©ã ãæ£åžžã«çµäºããªããããããªãããšãèæ ®ããŠæåã«ãŸãæ£èŠã®ãŠãŒã¶ãŒã§ã¯ããªãããšããåæåããããšããçºæ³ãšãããããã£ããã®ã¯ãã¹ãŠãéåžžã®æ¡ä»¶åå²ã®äžã«ãšã©ãŒãã³ããªã³ã°ã®çºæ³ãæ··ã蟌ãã§ãããšããè§£éãå¯èœãªã®ã ã
ããããªããããããã£ãããšã¯å¿ ãããã·ã§ã«ã¹ã¯ãªããã«éå®ãã話ãšããããªããããã¯å€ããŠæ°ãã話é¡ã§ãããããããã°æ£è§£ãšãããã£ããããçãã¯ããããååšããªãã
ãtruthyããšãfalsyããšããèšãæ¹ã«ã€ããŠã¯ããããããJavaScript: The Good PartsãïŒç¬¬1çã¯åèãéŠèš³ã2008幎åïŒããã³ã°ã»ã©ãŒãšãªã£ãŠä»¥éå®çãããã®ã ããã
JavaScriptã§ã¯ããªãåç䞻矩çã«ã===ããã!==ãã䜿ã£ãŠå³å¯ãªåå€ãæ¯èŒãã¹ãããšèãã人ãå€ããªã£ãããããŠãã®çºæ³ã¯PHPã«ãæ³¢åããŠããããã ã
Rubyã®å Žå㯠nil ãš false ã ããfalsyãšããã·ã³ãã«ãªã«ãŒã«ã§ããããŸãRubyã§ã¯ãã¹ãŠããªããžã§ã¯ãã§ããJavaScriptãPHPã®ãããªæå³ã§ã®ãåãïŒããªããã£ãåïŒã¯ååšããªããããå³å¯ãªåå€ãšãããããªçºæ³ã¯ããŸãããªãã
ãªãRubyã§ã¯ã===ãã¯ã¡ãœããã§ãããææ§ãªå€å®ã«èŠããããšãããããã===ããå³å¯ãªåå€å€å®æ¯èŒã§ããJavaScriptãPHPãšã¯å転ããŠããããã«æãã人ããããããããªãã
$ ruby -e 'p /a/ == "aaa"'
false
$ ruby -e 'p /a/ === "aaa"'
trueäžèšã§å®è¡ãããŠããã===ã㯠Regexp#=== ã§ãããRegexp#=== ã«ã€ããŠã¯ãªãã£ã·ã£ã«ã®æ¥æ¬èªçããã¥ã¡ã³ãã§ã¯ä»¥äžã
https://docs.ruby-lang.org/ja/latest/method/Regexp/i/=3d=3d=3d.html
Rubyã®äœè èªèº«ã¯ãåã«ã€ããŠãåçãéçãããšãã察æ¯ãšã匷ãåä»ãã匱ãåä»ããããšãã2çš®é¡ã®å¯Ÿæ¯ããããšããèãæ¹ã®ããã§ãããã€ãŸããåçã§åŒ·ãããåçã§åŒ±ãããéçã§åŒ·ãããéçã§åŒ±ããã®4çš®é¡ãããRubyã¯ãåçã§åŒ·ããåä»ããšããŠããã
ãŸã€ããšããã²ãã®ããã°ã©ãã³ã°èšèªè«ïŒ1ïŒ | æ¥çµã¯ãã¹ããã¯ïŒxTECHïŒ
https://xtech.nikkei.com/it/article/COLUMN/20060314/232388/
åºæ¬çã«ã¯ããã®çºæ³ã¯ãRubyã§ã¯ãªããžã§ã¯ãã·ã¹ãã â åã·ã¹ãã ããšããã®ãåæãšããããã ã
Pythonã®å Žåã¯å³å¯ãªåå€å€å®ãæšå¥šããããã¯ããªãããã ããç¹æ®ã¡ãœãã eq() ããªãŒããŒã©ã€ããããå¯èœæ§ãèæ ®ã㊠None ãã©ããã®å€å®ã«ã== Noneãã§ã¯ãªããis Noneãã䜿ãã¹ãããšããã®ã¯ããããããã
Pythonã§ã¯ãã®ããšãããããªããžã§ã¯ããç¹æ®ã¡ãœãã len() ãæã€å ŽåïŒã€ãŸããªããžã§ã¯ãã len() ã«æž¡ããå ŽåïŒã«ãã® len() ã®è¿ãå€ã 0 ã ã£ããfalsyãšãªãããããç©æ¥µçã«æŽ»çšããã®ãPythonicã§ãããšãããããšã®ã»ããå人çã«ã¯æ°ã«ãªãã
ããã¯ã€ãŸããé·ãããŒããªããã®ãªããžã§ã¯ãã¯falsyã§ããããšããã®ãPythonã®äžç芳ã§ãPythonããã䜿ãããçšéã«ãããŠã¯ããŸããã£ãŠããããã ã
ããã¯Python以å€ã®èšèªããã§ã«ããããç¥ã£ãŠãã人ã«ãšã£ãŠã¯ããªãéèŠãªãã€ã³ãã®ã¯ãã ããäžã«ããµãããPythonå ¥éæžãã§ã¯èª¬æãããªãããšããããå®éãçè ã2021幎å€ã«Pythonãå匷ããŠã¿ãããšæã£ãéã«ããªãé©ããç¹ã§ããã
ãã®è©±é¡ã¯Pythonã®ãªãã£ã·ã£ã«ã®æ¥æ¬èªçããã¥ã¡ã³ãã§ã¯ä»¥äžã
https://docs.python.org/ja/3/library/stdtypes.html#truth
ãŸããPythonãªãã£ã·ã£ã«ã®ã³ãŒãã£ã³ã°èŠçŽã§ããPEP8ã«ã¯ä»¥äžã®ãããªç®æãããã
ã·ãŒã±ã³ã¹ (æåå, ãªã¹ã, ã¿ãã«) ã«ã€ããŠã¯ã 空ã®ã·ãŒã±ã³ã¹ã False ã§ããããšãå©çšããŸãããã
PEP8ã®æ¥æ¬èªçã¯ä»¥äžã®URLã§èªããã
https://pep8-ja.readthedocs.io/ja/latest/
len() ãç¹å¥ãªæå³ãæã€Pythonã¯ããªããžã§ã¯ãæåãšããŠã®çŽç²ããæèçã«æŸæ£ããŠãããšããããã
ããŠããã§ãæè¿åºãæ¬ã®äžã§æ¯èŒçè©å€ã®è¯ããã®ãããã€ãåãäžããŠã¿ããã
äŸãã°ãEffective Python 第2çãïŒéŠèš³ã¯2020幎åãåèã¯2019幎åïŒãšããæ¬ã§ã¯ãPythonã®ããã°ã©ã ãããPythonicã«ããããã®ã³ãã90é ç®æããããŠããã
ãã®äžã®ãé ç®20 Noneãè¿ãã®ã§ã¯ãªãäŸå€ãéåºãããã§ã¯ãNone ãè¿ãããšã«ãã£ãŠãšã©ãŒçºçãäŒãããããããšããã°ã«ã€ãªãããããããšã玹ä»ãããŠããã解決çãšããŠå€å€ãè¿ãããšã«ãã£ãŠéåžžã®æ»ãå€ãšãšã©ãŒæ å ±ãåããããšãããã«è¯ã解決çãšããŠäŸå€ãéåºããããšãæšå¥šãããŠããã
Javaã®ãµã³ãã«ã³ãŒããšå ±ã«æªãã³ãŒãã®äŸã解説ãããŠãããè¯ãã³ãŒã/æªãã³ãŒãã§åŠã¶èšèšå ¥éãïŒ2022幎åïŒãšããæ¬ã§ã¯ãã12.6.3 ãšã©ãŒã¯æ»ãå€ã§è¿ããªããäŸå€ãã¹ããŒããããšãã«ãããŠãäžèšãšé¡äŒŒããè°è«ãããã
ãããŠè² ã®æ°å€ãè¿ãããšã§ãšã©ãŒæ å ±ãäŒãããããã®ããããã«ããŒãã³ã°ããšããŠããã
ãŸãã9.7 äŸå€ã®æ¡ã朰ããã§ã¯äŸå€ãæ¡ãã€ã¶ãããšããæ¥µããŠéªæªããšåŒ·ã衚çŸã§éé£ããã9.7.2 å顿€åºæã«ããããŸããå«ã°ãããã§ã¯äžæ£ãªç¶æ ã«å¯ŸããŠå¯å®¹ã§ããããšããç匟ãæã£ãŠãŠããŠãæ©ãåãã®ãšåãããšããšè¡šçŸããŠããã
Cèšèªã«ããããããã«ããŒãã³ã°ãã«ã€ããŠã¯ãäŸãã°ãCERT C ã³ãŒãã£ã³ã°ã¹ã¿ã³ããŒããã§ããšã©ãŒã ã£ãæã«è² ã®å€ã§è¿ãããããããšã«ã€ã㊠ERR02-C ã§ãæšå¥šã§ããªãããšããŠããã
ERR02-C. æ£åžžçµäºæã®å€ãšãšã©ãŒã®å€ã¯å¥ã®ææ®µã§éç¥ãã
https://www.jpcert.or.jp/sc-rules/c-err02-c.html
é«éæ§ããŠãªã«ããèšèªã®äžã§ã¯ãäŸãã°Goèšèªã«ãããŠãã¢ãã³ãªã¹ã¯ãªããèšèªãåããŠãããããªãšã©ãŒãã³ããªã³ã°ã®æ©æ§ããããŠèšèªæ©èœãšããŠã¯çšæããã«å€å€ãè¿ãããšã«ãã£ãŠãšã©ãŒã®æ å ±ãäŒããããšãæšå¥šãããŠããã®ããã話é¡ã«ãªã£ããããã
ãŸãå人çã«ã¯ãRustã«ãããResultåæåã®ååšããRustã®ããªãç¬ç¹ã§ããããã«ã¿ããæ©èœã® ? æŒç®åïŒquestion mark operatorïŒãæ°ã«ãªããšããã§ããããã® ? æŒç®åã¯ãã·ã§ã«ã¹ã¯ãªããã§èšããªãã0 ã§ãªãçµäºã¹ããŒã¿ã¹ãæ€åºãããå³åº§ã«ãã®çµäºã¹ããŒã¿ã¹ã䜿ã£ãŠé¢æ°ãã return ïŒãããã¯ã¹ã¯ãªããèªäœã exitïŒãšããçºæ³ã«è¿ãã
Rubyã«é¢ããæ¬ã§ã¯ãããããç®æã人ã®ããã®Rubyå ¥é[æ¹èš2ç]ãïŒ2021幎åïŒãšããæ¬ã®ã9.4.5 äºæããªãæ¡ä»¶ã¯ç°åžžçµäºããããã®ã»ã¯ã·ã§ã³ã§ãè¯ããªãäŸãšã㊠case ã«ããããelseç¯ãçšæããªããã¿ãŒã³ãã«ã€ããŠèª¬æãããŠããã
åé ã®åºé¡ã® cdwdoc-2023-001_challenge2.sh ã® get_hash() ãªã©ã¯ããŸãã«ãã®ãelseç¯ãçšæããªããã¿ãŒã³ããšããããã ã
get_hash() {
if type sha256sum > /dev/null; then
sha256sum | awk '{print $1}'
elif type openssl > /dev/null; then
openssl sha256 | awk '{print $2}'
fi
}ãã㯠case ã§ã¯ãªãããifç¯ã®æ¡ä»¶ã«ãelifç¯ã®æ¡ä»¶ã«ãåèŽããªãããšãããããã®ã¯äžç®çç¶ã§ãããã€ãŸã sha256sum ã³ãã³ãã openssl ã³ãã³ãããªãç°å¢ã ã
ãããŠãã®æ¬ã®åè¿°ã®ã»ã¯ã·ã§ã³ã§ããelseç¯ããªãããšã«ãã£ãŠçµæçã« nil ãè¿ãç¶æ ã«ãªã£ãŠããããç·ŽãããŠããªã宿ãªelseç¯ã«ãªã£ãŠãããããããšã«ã€ããŠã®èª¬æã«ãããŠããæéç匟ããšãã衚çŸãã¿ããããæ³å®ããŠããªãæ¡ä»¶ã§ããã°ãäŸå€ãçºçãããã¹ãã§ãããšããããã ã
Rubyã«ãããé©åãªelseç¯ãçšæããŠäŸå€ãçºçããããšããæ¹éã¯ãã·ã§ã«ã¹ã¯ãªããã®å Žåãªããé©åãªelseç¯ãçšæããŠã¹ã¯ãªããã 0 以å€ã®ã¹ããŒã¿ã¹ã§çµäºããããšãã圢ã§é©çšã§ãããã§ã¯ããã
ãããåé ã®åºé¡ã® get_hash() ã®å Žåã¯ãããããæ¹åãããããšããŠãããããªãçœ ãåŸ ã£ãŠããã®ã§ããã
ãã get_hash() ã«æžãè¶³ããŠä»¥äžã®ãããªelseç¯ãçšæãããšããã
else
return 1ãããŠå€æ° user_input_hash ãžã®ä»£å ¥ã®çŽåŸã«ä»¥äžã®ããã«æžãè¶³ãããšããã
exit_status_tmp=$?
[ $exit_status_tmp -ne 0 ] && exit $exit_status_tmpãã®å€æŽã«ãããget_hash() ã®çµäºã¹ããŒã¿ã¹ãèŠãŠãç°åžžãããã°ã¹ã¯ãªããèªäœã exit ããããšã«ãªãããã ã
ãã®å€æŽã¯å±æçã«èŠãã°ãŸãšããªçºæ³ã®ããã«ã¿ããããå šäœãšããŠã¯ããããªããšãèµ·ãããcdwdoc-2023-001_challenge2.sh ã 0 以å€ã®çµäºã¹ããŒã¿ã¹ã§çµäºããããšã¯ãåŒã¶åŽã® cdwdoc-2023-001_challenge.sh ã«ãããŠã¯ãæ£åœãªãŠãŒã¶ãŒã§ããããšãããã©ã°ããç«ãŠããŸãŸã«ãããããšã«ãªãã®ã ãã ãã倿ŽåŸã® get_hash() ã§elseç¯ã«å ¥ããããªç°å¢ïŒsha256sum ã³ãã³ãã openssl ã³ãã³ãããªãç°å¢ïŒã§ã¯ãã©ããªãã¹ã¯ãŒããå ¥åããŠãæ£åœãªãŠãŒã¶ãŒãšããŠèªèããããã°ã©ã ã«ãªã£ãŠããŸãã
åŒã¶åŽã® cdwdoc-2023-001_challenge.sh ã®ä»æ§ããããããããcdwdoc-2023-001_challenge2.sh ããŸãšãã«ããããšããããŠããããŸãè¯ãçµæã«ã¯ãªããªãã®ã§ããã
åè¿°ã®ããã«ãæåã«ä»¥äžã®ããã«ãæ£åœãªãŠãŒã¶ãŒã§ããããšåæåããŠããã®ããŸããã®ã ã
user_is_valid=1ãšããã§ããã®ãããã¯ããªãçè ã®äž»èгãå ¥ãé åã«ãªã£ãŠãã話ã§ã¯ããããJavaãCèšèªã®ãããã«ããŒãã³ã°ãã«æ¯ã¹ãã°ãPythonã§ãšã©ãŒæã« None ãè¿ãããšãRubyã§ãšã©ãŒæã« nil ãè¿ãããšã¯ãã»ã©éªæªãšã¯ãããªããããªæ°ãããã
ãããŠRubyã®å Žå㯠nil ãš false ã®ã¿ãfalsyãšããã·ã³ãã«ãªã«ãŒã«ã®ãããPythonã§ãšã©ãŒæã« None ãè¿ãããšã«æ¯ã¹ãã°ãRubyã§ãšã©ãŒæã« nil ãè¿ãããšã®ã»ããéªæªåºŠã¯äœããããããªãã
ãã ãããã nil ãè¿ãããšãããã®ãã³ãŒãã§å®è³ªçã«æç€ºãããŠããå Žåã§ãã£ãŠãcase ãè€éãªifæã§elseç¯ããªãããšã«ãã£ãŠçµæãšã㊠nil ãè¿ãããã«ãªã£ãŠãããããªã¡ãœããã¯ãã¯ãè¯ããªããšããããã ã
ã¡ãªã¿ã«Rubyã«ãããã·ã³ãã«ãªåŸçœ®ifã®å ŽåãRubyã«æ £ããŠãã人ã«ãšã£ãŠã¯ãæ¡ä»¶ã«åèŽããªãæã« nil ãè¿ããšããifæã®æ§è³ªãå©çšããŠãããšãæç€ºãããŠããããšæããããšãå€ãã
$ ruby -e 'p ("a" if true)'
"a"
$ ruby -e 'p ("a" if false)'
nilRubyã®ã³ã¢ã©ã€ãã©ãªã§ã¯ãæååãæ°å€ã«å€æãã Kernel#Integer ãªã©ã Ruby 2.6ïŒ2018幎ãªãªãŒã¹ïŒãããªãã·ã§ã³ãšã㊠exception ãåãä»ããããã«ãªã£ããKernel#Integer ã®å Žåãæ°å€ã«å€æã§ããªãæã¯ exception ã true ãªãäŸå€ãèµ·ãããfalse ãªã nil ãè¿ããããã©ã«ã㯠true ãªã®ã§äŸå€ãèµ·ããã
$ ruby -e 'p Integer("100")'
100
$ ruby -e 'p Integer("1_00")'
100
$ ruby -e 'p Integer("1_0_0")'
100
$ ruby -e 'p Integer("1_0_0_")'
-e:1:in `Integer': invalid value for Integer(): "1_0_0_" (ArgumentError)
from -e:1:in `<main>'
$ ruby -e 'p Integer("1_0_0_", exception: false)'
nilRubyã®ã³ã¢ã©ã€ãã©ãªã§ã¯ãä»ã«ã Kernel.#system ã§Ruby 2.6ãã exception ã远å ãããã
ãããã£ã2.6ã§ã® exception ã®å°å ¥ã«ã€ããŠã以äžã®ããã°èšäºã§Rubyã®éçºè ãµã€ãããã®è§£èª¬ãããã
ãããšèªã¿è§£ã Ruby 2.6 NEWS ãã¡ã€ã« - ã¯ãã¯ãããéçºè ããã°
https://techlife.cookpad.com/entry/2018/12/25/110240
ãã®ããã°èšäºã®äžã«ãnil ãè¿ãã®ãäŸå€ãèµ·ããã®ãã«ã€ããŠã®ç®æã§ä»¥äžã®ãããªèšè¿°ãããã
ãã®èŸºïŒãªã«ãããã©ã«ãã«çœ®ããïŒã¯èšèªãã¶ã€ã³ã®åŠãªã®ããªãšæããŸãã
ã¡ãªã¿ã« Kernel.#system ã¯å€éšã³ãã³ããå®è¡ããããã®ãã®ã§ãããKernel.#system ã®ã»ãã§ã¯ Kernel#Integer ãªã©ãšã¯éã§ãexception ã¯ããã©ã«ãã§ false ã§ãããã€ãŸãäŸå€çç¶æ³ã§ nil ãè¿ãã
以äžã¯ Kernel.#system ã§ãecho aããå®è¡ãããã®ã
$ ruby -e 'system("echo a")'
aKernel.#system ãå€ãè¿ããçµäºã¹ããŒã¿ã¹ã 0 ãªã trueããã以å€ã®çµäºã¹ããŒã¿ã¹ãªã false ã§ããã
$ ruby -e 'p system("echo a")'
a
true
$ ruby -e 'p system("false")'
false
$ ruby -e 'p system("exit 0")'
true
$ ruby -e 'p system("exit 1")'
falseãããŠå€éšã³ãã³ããå®è¡ã§ããªããã°ããã©ã«ãã§ã¯ Kernel.#system 㯠nil ãè¿ãã
$ ruby -e 'p system("dummyabcabcabc")'
nil
$ ruby -e 'str = "a" * 999999 ; p system("echo " + str)'
nilãexception: trueããæå®ãããšãnil ãè¿ãã®ã§ã¯ãªãäŸå€ãèµ·ããããã«ãªããããã§ãšã©ãŒã¡ãã»ãŒãžã®ãArgument list too longããšåäŒããããšã«ãªãããã ã
$ ruby -e 'p system("dummyabcabcabc", exception: true)'
-e:1:in `system': No such file or directory - dummyabcabcabc (Errno::ENOENT)
from -e:1:in `<main>'
$ ruby -e 'str = "a" * 999999 ; p system("echo " + str, exception: true)'
-e:1:in `system': Argument list too long - echo (Errno::E2BIG)
from -e:1:in `<main>'ããã©ã«ãã§ã¯ nil ãè¿ããããnil ãè¿ããããããªãããšãèæ ®ããã« Kernel.#system ãè¿ãå€ãæ¡ä»¶å€å®ã«äœ¿ããšãŸããããšããããããããªãã
$ ruby -e 'p system("echo " + "a" * 9 + " | grep a > /dev/null")'
true
$ ruby -e 'p system("echo " + "b" * 9 + " | grep a > /dev/null")'
false
$ ruby -e 'p system("echo " + "a" * 999999 + " | grep a > /dev/null")'
nil999999åãšãããã®ãããéã®ãaããå«ãŸããŠããã¯ãã ã£ãã«ãé¢ãããâŠâŠãããã§ãèµ·ããããã ã
ã¡ãªã¿ã«ãã³ãã³ããå®è¡ã§ããªããã° nil ãªã®ã ããå®è¡ã¯ã§ããããã©ãå®è¡ããŠã¿ãããArgument list too longããåºãããšãããããªå Žå㯠false ã«ãªãããšããããããããªãã
$ ruby -e 'str = "a" * 999999 ; p system("echo " + str + " > /dev/null")'
nil
$ ruby -e 'str = "a" * 99999 ; p system("str=" + str + " ; /bin/echo $str > /dev/null")'
true
$ ruby -e 'str = "a" * 99999 ; p system("str=" + str + " ; /bin/echo $str$str$str$str$str$str > /dev/null")'
sh: 1: /bin/echo: Argument list too long
falseããã¯ã€ãŸããRubyãå€éšã³ãã³ããçŽæ¥å®è¡ããã®ã§ã¯ãªããRubyãã·ã§ã«ãèµ·åããå Žåã ãKernel.#system ã¯ã;ãã®ãããªæåããããšçŽæ¥ã®å®è¡ã§ã¯ãªãã·ã§ã«ã«ã³ãã³ãã©ã€ã³æååãæž¡ãããã«ãªããã·ã§ã«èªäœã¯èµ·åã§ããããã·ã§ã«ãæå®ãããã³ãã³ãã©ã€ã³ãå®è¡ããããšãããšãArgument list too longããåºããšããå Žå㯠false ãªããã ã
ã¡ãªã¿ã«å®è¡çµæãæååãšããŠåãåãããæã¯ Kernel.#system ã§ã¯ãªã Kernel.#` ã䜿ãããã¡ãã¯ã³ãã³ããå®è¡ã§ããªãæã¯äŸå€ãèµ·ããã
$ ruby -e 'p `which sha256sum`'
"/usr/bin/sha256sum\n"
$ ruby -e 'p `type sha256sum`'
-e:1:in ``': No such file or directory - type (Errno::ENOENT)
from -e:1:in `<main>'
$ ruby -e 'p `type sha256sum;`'
"sha256sum is /usr/bin/sha256sum\n"
$ ruby -e 'p `type sha256sum;`.upcase'
"SHA256SUM IS /USR/BIN/SHA256SUM\n"type ã¯éåžžã¯ã·ã§ã«ã®ãã«ãã€ã³ã§ãããªãã®ã§ãtypeããšããã³ãã³ããå®è¡ããããšãããšäŸå€ãèµ·ãããããããªãããã;ããæ¿ããŠã·ã§ã«ã« type ãå®è¡ãããããã«ãããšæ¹è¡èŸŒã¿ã®æååãè¿ã£ãŠããããã ã
Kernel.#system ã nil ãè¿ããããããªãããšãèæ ®ããŠããªãå Žåãªã©ã¯ç¹ã«ãRubyã§ãALTLãªãŒããŒãããŒãèµ·ããããããšã¯ãšããããæç¢ºã«ãªã£ãã
ãã ããããŸã§ã®äŸã ãšå€éšã³ãã³ããèµ·åããªããã°ããã®ã§ã¯ããšããããšã«ããªãããã ã
ããã§ãALTLãªãŒããŒãããŒãšã¯äœãªã®ãããšããå®çŸ©ãããããã¯ã£ãããããã»ããè¯ãããã§ããã
çè ãèããALTLãªãŒããŒãããŒãšã¯ã以äžã®ãããªãã®ã§ããã
忣ã®èŠçŽ ã匷ãå¥ã®ããã°ã©ã Aã«å€Bãæž¡ãæããã®Bã®ããŒã¿éãå€ãããããã«Aãæ£åžžã«å®è¡ã§ããªãããšãããã«ãé¢ããããAãåŒã¶åŽã§ãã®ããšãæ³å®ããŠããªãããšã§èª€åäœãèµ·ããã
ãããå®çŸ©ã ã
ã忣ã®èŠçŽ ã匷ãããšããã®ã¯çšåºŠåé¡ã ããRubyã¯JavaãC++ã®ãããªãªããžã§ã¯ãæåã«æ¯ã¹ããšããšããšãªããžã§ã¯ãã®åæ£ã®åºŠåãã匷ããJavaãC++ã¯ãããŸã§ãã¢ããªã·ãã¯ãªæ§é ç©ã®æ§é åã®ããã«ãªããžã§ã¯ãæåããçãŸããèãæ¹ãäžéšåçšããŠãããšããæãã ããRubyã¯Smalltalkã«è¿ãã
SmalltalkãããŠãªããžã§ã¯ãæåã®çã¿ã®èŠªã§ããã¢ã©ã³ã»ã±ã€ã¯ãåœåã®æ§æ³ãšããŠãªããžã§ã¯ãã¯ãbiological cells and/or individual computers on a networkãïŒãããã¯ãŒã¯äžã®çäœçްèãåã ã®ã³ã³ãã¥ãŒã¿ïŒã®ãããªãã®ãšèããŠãããšèªã£ãŠããã
Dr. Alan Kay on the Meaning of "Object-Oriented Programming"
https://www.purl.org/stefan_ram/pub/doc_kay_oop_en
ããŠãããããã¯Rubyã§å®éã«åãã³ãŒãã§ç€ºãããšæãããããã§ã¯ããã忣ããã¯ã£ããããããã«ãHTTPã¢ã¯ã»ã¹ã§å€éšAPIã®ãããªãã®ãåŒãã§ããç¶æ³ãèããŠã¿ããã
以äžãéèŠãªãã€ã³ãã§ããã
HTTPã¢ã¯ã»ã¹ã«ããURLãé·ããããšãµãŒããŒã414ãšã©ãŒãè¿ããšãã仿§äžã®å¶éããã
Rubyã®ããã°ã©ã ã倿Žãå ããããŠãããã¡ã«ããã€ã®éã«ã nil ãããŸãåãæ±ããŠããªããã®ã«å€è²ããããšããã
äŸã«ãã£ãŠãããããæç€ºãããµã³ãã«ã¯å®éã«ãã£ãäºäŸãå ã«ããŠããããã§ã¯ãªããä»åãã®èšäºã®ããã«çè ãã§ã£ã¡äžãããã®ã§ããã
ãŸãããã®ãµã³ãã«ã¯ãã®èšäºã®ä»ã®ãµã³ãã«ãšã¯éã£ãŠãèªã¿æã®æ³ååã«å§ããéšåã倧ãããå®è³ªçã«ãããŒã®ã³ãŒããšãããéšåãããã
ãããŠãã®ãµã³ãã«ãéçãªååšãšããŠè§£æããŠãããŸãæå³ã¯ãªããæåã¯ç¹ã«åé¡ããªãã£ãRubyã®ã³ãŒããã倿Žãå ããããŠãããã¡ã«åŸã ã«ããããªããšã«ãªã£ããšãããã®å€åã®éçšãã€ã¡ãŒãžããŠã¿ãŠã»ããã
ãªãããã®èšäºã®å·çæç¹ïŒ2023幎3æ26æ¥æç¹ïŒã§ã¯RubyïŒCRubyïŒã®ææ°å®å®ããŒãžã§ã³ã¯3.2.1ã§ããã
åè¿°ã®ããªãŒããã«ã³ãŒããã§ã¯ãif !ãã¯äœ¿ãã¹ãã§ãªããšããŠããããšã¯åè¿°ã®ãšããã ããRubyã®å Žåã¯ããšããš unless ãååšããŠãããã¬ãŒãç¯ã§ã¯ unless ã®äœ¿çšãæšå¥šãã人ããããçè ããã䜿ããç¹ã«ã¬ãŒãç¯ãçãäžè¡ã§æããã³ãŒãã䞊ã¶ãããªãã®ã«ãªã£ãŠããå Žåãæå³ãæç¢ºã«ãªãã
def hoge(arg)
return unless arg
return unless arg.respond_to?(:length)
return unless arg.length >= 5
return unless arg.length <= MAX_QUERY_SIZE
...(some sort of sensitive process)...arg ã truthy ã§ããããšïŒnil ã§ã false ã§ããªãããšïŒãæ£åžžãarg ã length ã¡ãœãããæã€ã®ãæ£åžžãé·ãã¯5以äžãæ£åžžã§ MAX_QUERY_SIZE 以äžãæ£åžžã
ãreturn unlessãã®ããšã«æ¥ãã®ããããã®ã¡ãœããã§ã¯äœãæ£åžžãšã¿ãªããããèŠå®ãããã®ãšãªãã
極ããŠæç¢ºã
ã¡ãªã¿ã«Pythonã®äžçã§ã¯ len() ã¯ç¹å¥ãªæå³ãæã€ããRubyã«ã¯ç¹ã«ããããçºæ³ã¯ãªãããªããžã§ã¯ãæåãšããŠã®æŽã£ãäœç³»åãåªå ãããŠããã
äžèšã®4è¡ã§æžãããã¬ãŒãç¯ããã false ã length ã¡ãœãããæã£ãŠãããããããªããšãããããªå¯èœæ§ãèæ ®ããªããŠãããªããRuby 2.3以éã®ã&.ããšãããŒã£ã¡æŒç®åïŒsafe navigation operatorïŒãå©çšããŠã»ãŒåãããšã1è¡ã§æžãããããããªãã
def hoge(arg)
return unless (arg.respond_to?(:length)) && (arg&.length &.>= 5) && (arg&.length &.<= MAX_QUERY_SIZE)
...(some sort of sensitive process)...ãã ããæå³ã¯è¥å¹²åããã«ãããªã£ãã
ã§ã¯ãã® unless ãå©çšããã³ãŒãããå¥ã®äººã倧æ¥ãã§ if ã«æ¹ããªããã°ãªããªããªã£ããšãããã
ãšã«ããæ¥ããªããã°ãªããªããšããã ãŒãããã£ãããã以äžã®ãããªã³ãŒãã«å€æŽããããšãããããã¯ã©ãã ãããïŒ
def hoge(arg)
return if (! arg.respond_to?(:length)) || (arg&.length &.< 5) || (arg&.length &.> MAX_QUERY_SIZE)
...(some sort of sensitive process)...äžèŠãããšäŒŒããããªãã®ã«èŠããããå°ãéããnil ã length ã¡ãœãããæã£ãŠãããããªå¯èœæ§ã«ã€ããŠã¯ãŸããããšããŠããarg ã nil ã§ã¯ãªããã©ãã® arg ãæã€ length ã¡ãœãã㯠nil ãè¿ãæãããããšãããããªå Žåã«ããæããŠããŸãããã«æããã
以äžã®æžãæ¹ã®å Žåã¯ã(cond A) (cond B) (cond C) ã®ã©ããäžã€ã§ã nil ãããã°æããã
return unless (cond A) && (cond B) && (cond C)ã ããããããŒã£ã¡æŒç®åã«ã¯ãããªãã«æå³ããã£ãã
ã§ã以äžã¯éãã®ã§ããã
return if (cond A) || (cond B) || (cond C)ã¡ãªã¿ã«Rubyã§ã¯ nil ã«å¯ŸããŠã®ã<ãã¯ãšã©ãŒãèµ·ããããšãæåŸ ã§ããããnil ã«å¯ŸããŠã®ã&.<ã㯠nil ãè¿ãã
$ ruby -e 'p (nil < 5)'
-e:1:in `<main>': undefined method `<' for nil:NilClass (NoMethodError)
$ ruby -e 'p (nil &.< 5)'
nil
$ ruby --version
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux-gnu]ãã ãRubyã§ã¯ãã¢ã³ããŒããããå¯èœã§ã¯ãããã€ãŸããããããšæãã°å®è¡æã« nil ã«ã<ããšããç¹ç°ã¡ãœãããå®çŸ©ããããšãå¯èœã§ã¯ããã
$ ruby -e 'def nil.<(x) ; "maybe less than #{x}" ; end ; p (nil < 5)'
"maybe less than 5"ãŒã£ã¡æŒç®åã«ã€ããŠã¯ãnilãäŒæããŠããããšãå©çšããŠã¹ãããªæžããå Žåãããã®ã¯ç¢ºãã ããããã¿ã«å€çšããŠäžè¡ã«è©°ã蟌ãããšãããšåããã«ãããã°ã®æž©åºã«ãªãã
å®éã«åãã³ãŒãã§ç€ºããã
ãŸãæºå段éãšããŠã以äžã®ããã«æååã®é·ããè¿ãã ãã®ç°¡æçãªWebãµãŒããŒãèããã
cdwdoc-2023-001_ruby1_webrick.rb ( https://gitlab.com/-/snippets/2519468 )
#!/usr/bin/env ruby
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
require 'webrick'
websrv = WEBrick::HTTPServer.new({:Port => 8080})
websrv.mount_proc('/test') do |req, res|
res.body = req.query['str'].to_s.length.to_s + "\n"
end
websrv.startãã®äžã«ãŒã£ã¡æŒç®åã¯ãªããAPIçã«ãããåŒã¶åŽã«ç»å Žããã
ãªããããŒã8080ã䜿çšäžã®å Žåã¯ã:Port => 8080ãã®ç®æã倿Žããå¿ èŠããããããããªãã
ãŸããRubyã®gemã§ webrick ãããããšãåæã§ããã
$ gem list | grep -i webrick
webrick (1.7.0)å®è¡ãããšãåŸ åã®ç¶æ ã«ãªãã
$ ./cdwdoc-2023-001_sample_webrick.rb
[2023-02-02 23:28:27] INFO WEBrick 1.7.0
[2023-02-02 23:28:27] INFO ruby 3.0.2 (2021-07-07) [x86_64-linux-gnu]
[2023-02-02 23:28:27] INFO WEBrick::HTTPServer#start: pid=22027 port=8080
çµäºããæã¯ Ctrl + C ã§ããã
å®éã«ã¢ã¯ã»ã¹ããŠã¿ããšä»¥äžã®ããã«ãªãã
$ wget http://localhost:8080/test?str=aaa -q -O -
3
$ wget http://localhost:8080/test?str=aaaaaaaaaaaaaaaa -q -O -
16åœç¶ããaãã®æ°ãå€ããããšãArgument list too longãã®ãšã©ãŒã§ wget ã®èµ·åèªäœã«å€±æããã
$ str="$(yes 'a' | head -999999 | tr -d '\n')"
$ wget "http://localhost:8080/test?str=$str" -q -O -
bash: /usr/bin/wget: Argument list too longã§ã¯ãwget ã®èµ·åã«ã¯æåããçšåºŠã®å€§ããã«èª¿æŽãããšã©ããªããããã®å Žåã¯ã¹ããŒã¿ã¹ã³ãŒãã414ããè¿ãã®ã§ããã
$ str="$(yes 'a' | head -9999 | tr -d '\n')"
$ wget "http://localhost:8080/test?str=$str" -O - 2>&1 | grep -i error
2023-03-24 23:23:08 ERROR 414: Request-URI Too Large.ãRequest-URI Too Largeããšããèšãæ¹ã¯ãArgument list too longãã«ãã䌌ãŠããã
ããã¯WEBRickç¹æãšããããã§ã¯ãªããRFCã§èŠå®ãããŠãããã®ã ã2022幎6æçå®ã®RFC 9110ã§ã¯ãåã«ã414 URI Too LongããšããŠèŠå®ãããŠããã
RFC 9110: HTTP Semantics
https://www.rfc-editor.org/rfc/rfc9110.html#name-414-uri-too-long
éŠèš³ã¯ãäŸãã°ä»¥äžã®URLã«ããã
HTTP Semantics ïŒæ¥æ¬èªèš³ïŒ
https://triple-underscore.github.io/http-semantics2-ja.html#status.414
å€ãã®WebãµãŒããŒã§ã¯ãã®å¶éã¯èšå®ã«ãã£ãŠå€æŽããããšãã§ããã
èšå®å€æŽã«ã€ããŠã¯ãçè ã®ç°å¢ïŒLubuntu 22.04.1ã«äœãèãã apt-get ä»»ãã§Rubyãã€ã³ã¹ããŒã«ïŒã§ã¯ /usr/share/rubygems-integration/all/gems/webrick-1.7.0/lib/webrick/httprequest.rb ãšãããã¡ã€ã«ã®äžã® MAX_URI_LENGTH ã®å®æ°ã倿ŽããŠãã webrick ã require ããŠããã¹ã¯ãªãããåå®è¡ãããšå€æŽãããã
GitHub.com äžã®WEBRickã®ãªããžããªã§ã¯ã以äžã®ç®æã§ããã
https://github.com/ruby/webrick/blob/f87aec09fce09c142d2aa5108987338114327e4c/lib/webrick/httprequest.rb#L446
ãããŸã§èª¬æããŠããã®ã¯ãæååã®é·ããè¿ãã ãã®ç°¡æçãªWebãµãŒããŒãã«ã€ããŠã§ããã
ã§ã¯ããã®ãæååã®é·ããè¿ãã ãã®ç°¡æçãªWebãµãŒããŒããåŒã¶ãããªã¹ã¯ãªããã«ã€ããŠèããŠã¿ãã
以äžã¯ãã®ãããªã¹ã¯ãªããã§ããããŸãåè¿°ã®çãã¬ãŒãç¯ããã®ãŸãŸå©çšãããã®ã§ããã
cdwdoc-2023-001_ruby2.rb ( https://gitlab.com/-/snippets/2519468 )
#!/usr/bin/env ruby
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
require 'open-uri'
MAX_QUERY_SIZE = 30
def guard_test(arg)
# weird and too optimistic guard clause
return if (! arg.respond_to?(:length)) || (arg&.length &.< 5) || (arg&.length &.> MAX_QUERY_SIZE)
puts "**** arg has been accepted in guard_test() [ arg.length = #{arg.length} ] ****"
end
class Hoge
def initialize(str)
@str = str
end
def highload?()
(Time.now.strftime('%s').to_i % 10) <= 4
end
def length
return @str.bytesize unless highload?
begin
URI.open("http://localhost:8080/test?str=#{@str}") do |f|
f.first.chomp.to_i
end
rescue => e
#p "ERROR: #{e}"
nil
end
end
end
puts "---------" ; tmp = "a" * 4 ; puts 'String: "a" * 4' ; guard_test(tmp)
puts "---------" ; tmp = "a" * 5 ; puts 'String: "a" * 5' ; guard_test(tmp)
puts "---------" ; tmp = "a" * 6 ; puts 'String: "a" * 6' ; guard_test(tmp)
puts "---------" ; tmp = Hoge.new("a" * 4) ; puts 'Hoge: "a" * 4' ; guard_test(tmp)
puts "---------" ; tmp = Hoge.new("a" * 5) ; puts 'Hoge: "a" * 5' ; guard_test(tmp)
puts "---------" ; tmp = Hoge.new("a" * 6) ; puts 'Hoge: "a" * 6' ; guard_test(tmp)
puts "---------" ; tmp = Hoge.new("a" * 29) ; puts 'Hoge: "a" * 29' ; guard_test(tmp)
puts "---------" ; tmp = Hoge.new("a" * 30) ; puts 'Hoge: "a" * 30' ; guard_test(tmp)
puts "---------" ; tmp = Hoge.new("a" * 31) ; puts 'Hoge: "a" * 31' ; guard_test(tmp)
puts "---------" ; tmp = Hoge.new("a" * 50) ; puts 'Hoge: "a" * 50' ; guard_test(tmp)
puts "---------" ; tmp = Hoge.new("a" * 9999) ; puts 'Hoge: "a" * 9999' ; guard_test(tmp)Hoge ãšããã¯ã©ã¹ã® length ã¡ãœããã®äžã§ãå ã»ã©ã®ãæååã®é·ããè¿ãã ãã®ç°¡æçãªWebãµãŒããŒããåŒãã§ããããã ã
highload? 㯠Hoge ãæã€ã¹ãã¡ãœãããªã®ãïŒãšã length ã¯äœããã®ãã£ãã·ã¥çãªæ©æ§ãæã€ã¹ãã§ã¯ïŒãšãããããããããããããã®ã¯æ¬é¡ããå€ããã®ã§é©åœã«æ³åã§åããŠã»ããã
ãŸããguard_test ã«ã¯ã¬ãŒãç¯ãš puts ãããªãããããã¯ãããããã¹ãã³ãŒãããããšããããšã§ã¯ãªãã巚倧ãªé·ãã®ãªããžã§ã¯ããåãä»ããŠããŸããšäœãéåžžã«ãŸããããšãèµ·ããããšããããã«çœ®ãæããŠèããŠã»ããã
ãã®ãé·ããã«ã€ããŠããå®éã®ã³ãŒãã§ã¯æååã®é·ãã°ãããèŠãŠããããå®éã¯äœãè€éãªæ§é ãæã£ãŠãããã®ã§ããããé·ãããç®åºããã®ã«ãããªãã®è² è·ãããããšããç¶æ³ãæ³åããŠã»ããã
éèŠãªã®ã¯ãã·ã¹ãã ãé«è² è·ã®æã®ã¿ïŒã€ãŸã highload? ã true ãè¿ãæã®ã¿ïŒå ã»ã©ã®APIçãªãæååã®é·ããè¿ãã ãã®ç°¡æçãªWebãµãŒããŒãã«ã¢ã¯ã»ã¹ããŠããããšããã㊠guard_test ã®äžã®ã¬ãŒãç¯ããåãåã£ããªããžã§ã¯ãã® length ã¡ãœããã nil ãè¿ãå Žåã«ããæãããã®ã«ãªã£ãŠããããšã ã
ã¡ãªã¿ã« highload? ã¡ãœããã¯ãå®éã«é«è² è·ãã©ããããã§ãã¯ããŠããã®ã§ã¯ãªãå®å šã«ãããŒã§ãçŸåšæå»ã®ç§ã®1ã®äœã0ã4ã®æã true ã ãé«è² è·ã§ã¯ããªãããªãã°åã« @str.bytesize ã®çµæã return ããããé«è² è·ãªãåŠçãä»ã«ä»»ããïŒåæ£åŠçãããïŒãšããããã ã
åè¿°ã®ã倿Žãå ããããŠãããã¡ã«åŸã ã«ããããªããšã«ãªã£ãããšããã®ã¯ã€ãŸããæå㯠Hoge ã® length ã¡ãœãã㯠nil ãè¿ãããšãããããªãã¯ãã ã£ããã®ãã忣ãåæã«ããŠãã nil ãè¿ãããšãããããããã«ãªã£ãããšãããã®ãç©èªæ§ããã€ã¡ãŒãžããŠã»ããããšããããšã§ãããããã«ãã¬ãŒãç¯ã«ã€ããŠãæå㯠length ã¡ãœããã nil ãè¿ãå Žåã«ã¬ãŒãã§ããŠããïŒãããã¯ãšã©ãŒã«ãªã£ãŠããïŒã¯ãã®ãã®ãããã€ã®éã«ãããæãããã®ã«ãªã£ãŠããããšããå¥ã®ãç©èªããçµã¿åããã£ãŠããããã ã
ãªãããã® cdwdoc-2023-001_ruby2.rb ãå®è¡ããŠã¿ãŠãã©ãèããŠããã®èšäºã®è§£èª¬ã®éãïŒã€ãŸãçè ã®æåŸ éãïŒã«åããŠããããã«ã¯èŠããªãããšããå Žåã¯ã#p "ERROR: #{e}"ãã®ã³ã¡ã³ãã¢ãŠãã®è¡ã®ã³ã¡ã³ãã¢ãŠããå€ããšåå ãåãããããããªãã
ãã® cdwdoc-2023-001_ruby2.rb ãå®è¡ãããšãå®è¡çµæããããããšè¡šç€ºããããããã§ã¯æåã®13è¡ã ããæ²èŒããã
$ ./cdwdoc-2023-001_ruby2.rb | head -13
---------
String: "a" * 4
---------
String: "a" * 5
**** arg has been accepted in guard_test() [ arg.length = 5 ] ****
---------
String: "a" * 6
**** arg has been accepted in guard_test() [ arg.length = 6 ] ****
---------
Hoge: "a" * 4
---------
Hoge: "a" * 5
**** arg has been accepted in guard_test() [ arg.length = 5 ] ****guard_test ã§ã¯ãåãåã£ããªããžã§ã¯ãã® length ã¡ãœããã®çµæã5以äž30以äžã§ããã°åãä»ããã¯ãã ã
åãä»ããå Žåã¯ã**** arg has been accepted ...ããšè¡šç€ºãããã
æåŸã®ãã¹ããã¿ãŒã³ã¯9999åã® "a" ã§åæåãã Hoge ã®ã€ã³ã¹ã¿ã³ã¹ã guard_test ã«æž¡ããã®ã§ããã
çŸåšæå»ã®ç§ã®1ã®äœã5ã9ã®æïŒé«è² è·ã§ãªãæïŒã«å®è¡ãããšãå®è¡çµæã®æåŸã®ã»ãã¯ä»¥äžã®ããã«ãªãã
$ date ; ./cdwdoc-2023-001_ruby2.rb | tail -5
Sat Mar 25 04:33:37 JST 2023
Hoge: "a" * 31
---------
Hoge: "a" * 50
---------
Hoge: "a" * 9999çŸåšæå»ã®ç§ã®1ã®äœã0ã4ã®æïŒé«è² è·ã®æïŒã«å®è¡ãããšãå®è¡çµæã®æåŸã®ã»ãã¯ä»¥äžã®ããã«ãªãã
$ date ; ./cdwdoc-2023-001_ruby2.rb | tail -5
Sat Mar 25 04:33:42 JST 2023
---------
Hoge: "a" * 50
---------
Hoge: "a" * 9999
**** arg has been accepted in guard_test() [ arg.length = ] ****åè¿°ã®ALTLãªãŒããŒãããŒã®å®çŸ©ããããããŠæ²èŒããã
忣ã®èŠçŽ ã匷ãå¥ã®ããã°ã©ã Aã«å€Bãæž¡ãæããã®Bã®ããŒã¿éãå€ãããããã«Aãæ£åžžã«å®è¡ã§ããªãããšãããã«ãé¢ããããAãåŒã¶åŽã§ãã®ããšãæ³å®ããŠããªãããšã§èª€åäœãèµ·ããã
ãã®Rubyã®ãµã³ãã«ã®å Žåã¯ãã忣ãã¯å€éšã³ãã³ããšãã圢ã§ã¯ãªãHTTPã¢ã¯ã»ã¹ã§ããæ£åžžã«å®è¡ã§ããªãããšãããã㯠length ã nil ãè¿ãããšããããšããããšã§ããåŒã¶åŽã§ãã®ããšãæ³å®ããŠããªãã㯠length ã nil ãè¿ãæã«ããæããïŒçãã¬ãŒãç¯ïŒãšããããšã§ããã
ãšããã§ä»åãRubyã®ãµã³ãã«ãå®éã«æžããŠã¿ãŠæ°ã¥ããããšããããHTTPã®å Žå㯠GET ã§ã¯ãªã POST ã§æž¡ãã°ã414 URI Too Longãã®ãšã©ãŒã¯èµ·ãããªãããã ããããã¯ã·ã§ã«ã¹ã¯ãªããã«ãããŠã³ãã³ãã©ã€ã³åŒæ°ã§ã¯ãªãæšæºå ¥åºåã§å€ã®åãæž¡ããããã»ããããããšããã®ãšé¡äŒŒããŠããã®ã§ããã
ã
ã¹ã¯ãªããèšèªã«ãããé²åŸ¡çããã°ã©ãã³ã°ãã€ãã€ãã
é²åŸ¡çããã°ã©ãã³ã°ïŒdefensive programmingïŒã«ã€ããŠèãããã
GitHub Security Labã®ããã°ã«ãPerlãPythonãPHPãªã©ã®èšèªã€ã³ã¿ããªã¿ã®è匱æ§ã«ã€ããŠã®è§£èª¬èšäºãããã2020幎ã®å€ã«å ¬éããããã®ã§ããã
Now you C me, now you donât: An introduction to the hidden attack surface of interpreted languages | GitHub Security Lab
https://securitylab.github.com/research/now-you-c-me/
ãã®èšäºã®äžã«ãPythonã®è匱æ§ã® CVE-2014-1912 ã«ã€ããŠã®ä»¥äžã®ãããªç®æãããã
But thatâs exactly why this is an interesting case. Not because the vulnerability was widespread in the real world. Itâs interesting because developers in memory managed languages tend to explicitly trust the language implementation to keep them safe. There is a cognitive dissonance that may occur when issues such as CVE-2014-1912 are present in the language.
以äžãDeepLèš³ãåèã«ããæèš³ã
ã§ããããããããã®ã±ãŒã¹ãè峿·±ãçç±ãªã®ã§ããçŸå®äžçã«ãã®è匱æ§ãåºã浞éããŠããããã§ã¯ãããŸãããã¡ã¢ãªç®¡çåèšèªã®éçºè ã¯ãèšèªåŠçç³»ãèªåãã¡ã®å®å šãå®ã£ãŠããããšæç¢ºã«ä¿¡é ŒããåŸåããããããã«ãè峿·±ãã®ã§ããCVE-2014-1912 ã®ãããªåé¡ãèšèªã«ååšããå Žåãèªç¥çäžååãèµ·ããå¯èœæ§ãããã®ã§ãã
ãŸãã以äžã®ãããªç®æãããã
This teaches us the lesson that the assumption of safe memory management semantics, even in higher level languages that advertise memory safety, is never a given. When dealing with APIs that explicitly operate on statically sized mutable buffers, it never hurts to ensure that your sizes match your buffers, even in cases where itâs presumably safe to not do so by virtue of the language itself.
以äžãDeepLèš³ãåèã«ããæèš³ã
ãã®ããšã¯ãããšãã¡ã¢ãªå®å šæ§ãæšæŠããŠããé«çŽèšèªã§ãã£ãŠããå®å šãªã¡ã¢ãªç®¡çã»ãã³ãã£ã¯ã¹ãä»®å®ããããšã¯æ±ºããŠæ£ããããšã§ã¯ãªããšããæèšãç§ãã¡ã«æããŠãããŸããéçãªãµã€ãºã®å€æŽå¯èœãªãããã¡ãæç€ºçã«æäœããAPIãæ±ãå Žåãããšãèšèªãã®ãã®ãåããå¹èœã«ãã£ãŠãããããããªããšãããªããŠãå®å šã ãããšæšå®ããããããªå Žåã§ãã£ãŠããããŒã¿ãµã€ãºããããã¡ãµã€ãºãšé£ãåãããšã確èªããŠããããšã¯æ±ºããŠç¡é§ã§ã¯ãããŸããã
ãªããã®èšäºã§ã¯ãæåã¯ãã«ãšã¯ã¹ããã€ãïŒfull exploitationïŒãäžå¯èœã ãšæãããPerlã®èåŒ±æ§ CVE-2005-3962 ããã°ããããŠãããã«ãšã¯ã¹ããã€ãå¯èœãªãã¿ãŒã³ãååšããããšãåãã£ãä»¶ã«ã€ããŠã®è§£èª¬ãããããããã«ã€ããŠã¯ä»¥äžã®ãããª2005幎ã®èšäºããããè±èªã®åæã¯ãã確èªã§ããªããããããªãã
Perlã®è匱æ§ã¯æ°·å±±ã®äžè§ã - ITmedia ãšã³ã¿ãŒãã©ã€ãº
https://www.itmedia.co.jp/enterprise/articles/0512/06/news064.html
ããŠããã§ãæååã®åŠ¥åœæ§ã®ãã§ãã¯ã®ããã«æ£èŠè¡šçŸã䜿ãå ŽåãèããŠã¿ããã
PHPãªã©ã«ãããŠãpreg_match() ãªã©ã®é¢æ°ã¯ãstrpos() ã strlen() ã®ãããªã·ã³ãã«ãªé¢æ°ãããè€éã§ãããæªç¥ã®è匱æ§ãæœãã§ããå¯èœæ§ãé«ããšèããããšã¯ãããªãã«åŠ¥åœãšãããã
ã ãããšãã£ãŠ strpos() ã strlen() ãå®å šã ãšå®£èšãããããã§ã¯ãªãã®ã ããå°ãªããšããã°ãã³ãã£ã³ã°çãªèгç¹ãã㯠preg_match() ãªã©ã®è€éãªé¢æ°ããã strpos() ã strlen() ã®ãããªåºæ¬çãªé¢æ°ã«è匱æ§ãèŠã€ããã»ããã¯ããã«ã€ã³ãã¯ãã倧ããã®ã¯ç¢ºãã§ãããã€ã³ãã¯ãã倧ããããšãæ³å®ããããã®ã«ã¯ãå€ãã®ç®ã泚ãããããã
ã¡ãªã¿ã«Rubyã«ã¯ String#start_with? ã String#end_with? ããããPythonã«ã¯ startswith ã endswith ããã£ãããPHPãPHP8ãã㯠str_starts_with() ã str_ends_with() ããã¯ããŸã str_contains() ãªã©ãç»å ŽããŠããããã ã
PHPãªã©ã«ãããŠãåŠ¥åœæ§ã®ãã§ãã¯ã®ããã« preg_match() ã«æååãæž¡ããããåã«ããŸããµã€ãºã®ãã§ãã¯ãªã©ãå«ããŠåºæ¬çãªé¢æ°ã䜿ã£ãŠã¯ãããŠããããšããæ¹æ³ã¯æ¡ãããã ãããã¯äŸãã°ãã¬ãŒãç¯ã«çãã³ãŒãã䞊ã¶ãããªå Žåã«ãpreg_match() ã䜿ã£ãŠæãããããªç®æã¯ã¬ãŒãç¯ã®æåŸã®ã»ãã«é 眮ããå ã«ãµã€ãºãªã©ã®ã·ã³ãã«ãªãã§ãã¯ã§æããããã«ãããšããçºæ³ã§ããã
2023幎3æçŸåšã§ã¯ãé床é¢ã§ã¯ãªãã»ãã¥ãªãã£ã®èгç¹ã§ããããã³ãŒãã£ã³ã°ãããã®ã¯ããªããã©ãã€ã¢çã§ãããšããããšã«ãªãã®ãããããªãããæªç¥ã®è匱æ§ãŸã§å«ããŠé²åŸ¡çã§ãããããªã³ãŒãã£ã³ã°ãšããŠã©ã®ãããªã¹ã¿ã€ã«ãããããã®ãããšèããŠã¿ãããšãããŸã«ã¯æçšãããããªãããã ãããã§èãããæçšããšããã®ããåºæ¬çã«ã¯ãå®å®ç·èæ§ããšäŒŒããããªæ¹åæ§ã®ãã®ã§ãããªããšã¿ãªãããŠã仿¹ããªãã®ãããããªãã
ãå®å®ç·èæ§ããšããã®ã¯ãããªãã®ç¥ããªãè¶ çµ¶æå·§ããã°ã©ãã³ã°ã®äžçãïŒ2015幎åïŒãšããæ¬ã«ãã£ããã®ã§ãã³ãŒãã®ã©ãã1ãã€ããåé€ããŠãåé€åãšå šãåãçµæãåºåããããã°ã©ã ã ã
ãã®æ¬ã®ã1-9-1 å®å®ç·èæ§Quineãã®ã»ã¯ã·ã§ã³ã®ã³ãŒãã¯ã以äžã®URLã«ãã rquine.rb ã§ãããããã¯ãradiation-hardenedãïŒæŸå°ç·èæ§ãå®å®ç·èæ§ïŒãæœããã€ã€ãããã«ã¯ã¯ã€ã³ã§ãããããªããã°ã©ã ã§ãããé©åœã«3ç®æãããæ¶ããŠããéãè¯ããã°å®å
šã«å
éãã«åãããããã®ãæãããã
https://github.com/mame/radiation-hardened-quine
ã¯ã¯ã€ã³ã§ãããšããããšã¯èªåèªèº«ãåºåãããšããããšã ããäžèšã®äŸã®å Žåã¯ããã°ã©ã ãæå·ãåãããšããŠãå®è¡ããã°ä¿®åŸ©ãããããŒãžã§ã³ãåºåãããããã§ãèªå·±ä¿®åŸ©çãšãããã
ãšããã§åè¿°ã®GitHub Security Labã®ããã°èšäºã¯å€ãã®èšèªã®èšèªå®è£ ç³»ãCèšèªãªã©ã®ã¡ã¢ãªã»ãŒãã§ãªãèšèªã§æžãããŠããããšã«æ³šç®ããŠãããããããããã®ãšã¯ãŸã£ããéããã®ãšããŠãSpotifyã2013幎ã«å ¬éãã以äžã®èšäºã¯ã¹ãªãªã³ã°ã§é¢çœãã
Creative usernames and Spotify account hijacking - Spotify Engineering
https://engineering.atspotify.com/2013/06/creative-usernames/
ããã¯ã¡ã¢ãªã»ãŒãã§ãªãèšèªç¹æã®è匱æ§ãšã¯å€§ããç°ãªã£ãŠããããããŠSpotifyã®ã³ãŒãã«ããSpotifyã䜿çšããŠããTwistedãšããã©ã€ãã©ãªã«ããPythonã®æšæºã©ã€ãã©ãªã«ããããããã«ãããŠç¹ã«æ·±å»ãªè匱æ§ããã£ããšããããã§ã¯ãªãã
Pythonã®ããŒãžã§ã³ã2.4ãã2.5ã«äžããããšã«ãã£ãŠPythonã®æšæºã©ã€ãã©ãªã® unicodedata ã®æ¯ãèãã埮åŠã«å€ããããã®ããšã«ãã£ãŠæååã®ãåäžæ§ãã«å€§ããé¢ããTwistedã®ãã颿°ã®æ¯ãèãã埮åŠã«å€ãã£ãããã«ãSpotifyã«ãããŠåæã«ä»äººã®ã¢ã«ãŠã³ãã®ãã¹ã¯ãŒããªã»ãããã§ããŠããŸãç¶æ ã ã£ããšãããå®éã«ãã£ãäºäŸã ã
ã¡ãªã¿ã«ããã€ãªã€ã³ãã©ããã£ã¯ã¹ããŒã¿ã¹ãã«ãã®ã1.4 åçŸå¯èœãªç ç©¶ãã«ã¯ã以åãšã¯ãŸã£ããéãè§£æçµæã«ãªã£ãŠåå ãåãããå°æããŠããããRããã±ãŒãžã®ããŒãžã§ã³ããæ°ããããŒãžã§ã³ã«ãªã£ãŠããããšãåå ã ã£ããšããããã®æ¬ã®äœè ãå®éã«ééããäºäŸã玹ä»ãããŠããã
ããŠã
ãã®èšäºãããããçµããã«è¿ã¥ããŠããããšã§ã¯ããããã·ã§ã«ã¹ã¯ãªããã«ãããŠãããã埮åŠãªæ¯ãèãã®éããã»ãã¥ãªãã£ãªã¹ã¯ã«ãªãããå Žåãšããã®ãå®éã®ã³ãŒãã§ç€ºããã
ãã·ã§ã«ã¹ã¯ãªããã«ãããçŸå®çãªæ³šæç¹ãã®ã»ã¯ã·ã§ã³ã®çµç€ã§è¿°ã¹ãããã«ãã·ã§ã«ã¹ã¯ãªããã§ã¯åçš®ã³ãã³ããããŒã«ãã©ã€ãã©ãªé¢æ°ã®ãããªååšã«ãªãã
ããã§ãSolarisã® /usr/bin/awk ã«ååšããŠããå¶éãšããã®å¶éã®äž¡çŸ©çãªåŽé¢ã«çç®ãããã
Solarisã® /usr/bin/awk ã¯ã2018幎ãªãªãŒã¹ã®Solaris 11.4ã§ãã£ãŠããããããªæå³ã§ããã«ãããã®AWKã§ããã
$ echo aaa | /usr/bin/awk '{print toupper()}'
awk: syntax error near line 1
awk: illegal statement near line 1
$ echo aaa | /usr/bin/awk '{print toupper($1)}'
aaa
$ echo aaa | /usr/bin/nawk '{print toupper()}'
AAA
$ uname -a
SunOS solaris 5.11 11.4.0.15.0 i86pc i386 i86pcãããŠä»åçç®ãããå¶éãšã¯ã1ã€ã®ã¬ã³ãŒãã®ããŒã¿éã ãããã確èªããŠã¿ãã
$ yes 'a' | head -2559 | tr -d '\n' | wc -c
2559
$ yes 'a' | head -2559 | tr -d '\n' | /usr/bin/awk '{print}' | wc -c
2560
$ yes 'a' | head -2560 | tr -d '\n' | /usr/bin/awk '{print}' | wc -c
awk: record `aaaaaaaaaaaaaaaaaaaa...' too long
0
$ echo ${PIPESTATUS[@]}
141 0 0 2 01è¡ã2559ãã€ããŸã§ãªãç¹ã«åé¡ãªããã2560ãã€ããããã¯ãã以äžã®è¡ïŒã¬ã³ãŒãïŒã«ééãããš /usr/bin/awk ã¯åŠçãæŸæ£ããŠãçµäºã¹ããŒã¿ã¹ 2 ã§çµäºããŠããŸãã®ã§ããã
ãšã©ãŒã¡ãã»ãŒãžã«ãtoo longããšãããããArgument list too longããšäŒŒãŠããããã«ãèŠãããã§ãAWKã®èµ·åã«å€±æããŠããããã§ã¯ãªããããã¯ã·ã§ã«ã§ã¯ãªãAWKãåºåãããtoo longãã ã
以äžã®ããã«ãããšåãããã2560ãã€ã以äžãããããªè¡ã«ééãããŸã§ã¯ãAWKã¯ã¡ãããšåŠçããã®ã§ããã
$ { echo aaa; echo bbbb; echo ccccc; yes 'd' | head -2560 | tr -d '\n' ; } | /usr/bin/awk '{ print length() }'
3
4
5
awk: record `dddddddddddddddddddd...' too long
record number 3Solarisã«ã¯è€æ°ã®AWKãå ¥ã£ãŠãããã/usr/bin/nawk ã /usr/xpg4/bin/awk ã /usr/gnu/bin/awk ïŒgawkïŒã«ã¯ãã®å¶éã¯ãªãã
$ yes 'a' | head -2560 | tr -d '\n' | /usr/bin/nawk '{print length()}'
2560
$ yes 'a' | head -2560 | tr -d '\n' | /usr/xpg4/bin/awk '{print length()}'
2560
$ yes 'a' | head -2560 | tr -d '\n' | /usr/gnu/bin/awk '{print length()}'
2560ãã ã /usr/xpg4/bin/awk ã«ã¯19999ãã€ã以äžã®å Žåã®ãRecord too longãã®å¶éããããããããªãã
$ yes 'a' | head -19998 | tr -d '\n' | /usr/xpg4/bin/awk '{print length()}'
19998
$ yes 'a' | head -19999 | tr -d '\n' | /usr/xpg4/bin/awk '{print length()}'
/usr/xpg4/bin/awk: line 0 (NR=1): Record too long (LIMIT: 19999 bytes)
$ echo ${PIPESTATUS[@]}
141 0 0 1ããŠãããã§ä»¥äžã®ãããªã¹ã¯ãªãããçšæããŠã¿ããã
cdwdoc-2023-001_solaris.sh ( https://gitlab.com/-/snippets/2516176 )
#!/bin/sh
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
path=$( printf '%s\n' "$1" | /usr/bin/awk -F: '{print $1}' )
line_num=$( printf '%s\n' "$path" | wc -l | sed 's/[^0-9]*//g' )
if [ "x$line_num" != 'x1' ]; then
echo 'error: (multiple line)' >&2
exit 1
fi
case $path in
*..*) echo 'error: (".." was found)' >&2 ; exit 1;;
/home/*) :;;
*) echo 'error: (not start with "/home/")' >&2 ; exit 1;;
esac
printf '%s\n' "$1" | cut -d: -f1 >> requested_path_list.txt
exit 0ãã®ã¹ã¯ãªããã¯ãäŸãã°ã/home/aaa:abcdeãã®ãããªæååãåŒæ°ãšããŠæž¡ããããšãã/home/aaaãã requested_path_list.txt ãšããããã¹ããã¡ã€ã«ã«è¿œèšããã
$ ./cdwdoc-2023-001_solaris.sh '/home/aaa:abcde'
$ tail requested_path_list.txt
/home/aaaã:ããåºåããšã¿ãªããæã®1ã€ç®ã®ã«ã©ã ãã/home/ãã§å§ãŸã£ãŠããªãå ŽåãäŸãã°ã/home123/aaa:abcdeãã®ãããªãã®ã¯ãšã©ãŒã«ãªããããã¹ããã¡ã€ã«ã«ã¯äœãæžã蟌ãŸããªãã
$ rm -f requested_path_list.txt
$ ./cdwdoc-2023-001_solaris.sh '/home123/aaa:abcde'
error: (not start with "/home/")
$ tail requested_path_list.txt
tail: cannot open inputãŸããã..ããå«ãã§ãããæ¹è¡ãå«ãã§ãããããå Žåããšã©ãŒã«ãªãã
$ ./cdwdoc-2023-001_solaris.sh '/home/aaa/../../root:abcde'
error: (".." was found)
$ ./cdwdoc-2023-001_solaris.sh '/home/aaa:abcde
> /home/bbb:xyz'
error: (multiple line)ã..ããå«ããã©ããã®ãã§ãã¯ã«ã¯ case ã䜿ã£ãŠããããããã®ç®æã§ALTLãªãŒããŒãããŒãèµ·ããããšã¯ãªãã
ãããããã®ã¹ã¯ãªããã«ã¯ããã€ãããããªãšãããããã
åé ã§å€æ° path ãçæããã¯ãã ããæåŸã¯ããã䜿çšããã«ãŸã $1 ã cut ã§åãåºããããŒã¿ãããã¹ããã¡ã€ã«ã«è¿œèšããŠããã
ãŸãã倿° path ãçæããæã¯ /usr/bin/awk ã䜿ã£ãŠããã®ã«ãæåŸã«ã¯äœæ ã cut ã䜿ã£ãŠããã®ããã€ã³ãã§ããã
ããã§ã以äžã®ããã«ããŠçæãã str2 ãèããŠã¿ãã
$ str=$(yes 'a' | head -9999 | tr -d '\n')
$ str2=$(printf '/home/hoge:aaa\n/root:%s' "$str")ãã® str2 ã¯è€æ°è¡ã®æååã ã1è¡ç®ã¯ã/home/hoge:aaaãã ãã ã2è¡ç®ãããããé·ããã®ã«ãªã£ãŠããã
åè¡ã®å é 50æåãæœåºãããšä»¥äžã®ããã«ãªãã
$ echo "$str2" | sed 's/^\(.\{50\}\).*/\1/'
/home/hoge:aaa
/root:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSolaris 11.4ã§ãã®ããã«çæãã str2 ãåŒæ°ãšããŠæž¡ã㊠cdwdoc-2023-001_solaris.sh ãå®è¡ãããšã以äžã®ããã«ãªãã
$ rm -f requested_path_list.txt
$ ./cdwdoc-2023-001_solaris.sh "$str2"
awk: record `/root:aaaaaaaaaaaaaa...' too long
record number 1
$ tail requested_path_list.txt
/home/hoge
/rootã/home/ãã§å§ãŸã£ãŠããªãã/rootããšããè¡ã requested_path_list.txt ã«æžã蟌ãŸããŠããŸã£ãã
Solaris 11.4ã§ã¯ã以äžã®èŠçŽ ãçµã¿åããã£ãŠãã®ãããªããšãèµ·ããããã ã
/usr/bin/awk ã®å¶éã«ããã倿° path ã¯1è¡ç®ã ããæœåºããããã®ã«ãªã
倿° line_num ã¯å€æ° path ã®è¡æ°ã®ããã1 ã«ãªã
æåŸã«å€æ° path ã䜿çšããã«ããäžåºŠ $1 ã䜿çšããŠãã
cdwdoc-2023-001_solaris.sh ã® /usr/bin/awk ã®ç®æã /usr/bin/nawk ãªã©ã«å€æŽããŠããå®è¡ããããããã㯠/usr/bin/awk ã gawk ã mawk ã§ãããããªç°å¢ïŒã€ãŸãDebianç³»ãå«ãå€ãã®LinuxïŒã§å®è¡ããã°ã倿° path ãè€æ°è¡ã«ãªããããšã©ãŒã«ãªãã¯ãã§ããã
ããŠããããŸã§èŠãŠããããã« cdwdoc-2023-001_solaris.sh ã®ãããªã¹ã¯ãªããã®å Žåã¯Solarisã® /usr/bin/awk ã®å¶éã«ãã£ãŠã»ãã¥ãªãã£ãªã¹ã¯ãå¢ãäŸã§ããã
以äžã¯éã«ãå¶éã®ãããã§å®ããããšããäŸã§ããã
cdwdoc-2023-001_solaris2.sh ( https://gitlab.com/-/snippets/2516176 )
#!/bin/sh
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
user_home_dir=$( grep '^user4:' < passwd.txt | head -1 | /usr/bin/awk -F: '{print $6}')
user_shell=$( grep '^user4:' < passwd.txt | head -1 | /usr/bin/awk -F: '{print $7}')
# too optimistic
if /bin/echo "x$user_home_dir$user_shell" | grep '[^a-z0-9/]' > /dev/null ; then
echo "error: invalid data" >&2
exit 1
fi
realpath "$user_home_dir" >> requested_path_list.txt
exit 0ãã®ã¹ã¯ãªããã¯ããã·ã§ã«ã¹ã¯ãªããã«ãããçŸå®çãªæ³šæç¹ãã®ã»ã¯ã·ã§ã³ã®çµç€ã«ç»å Žãã cdwdoc-2023-001_sample_dir3.sh ãšãã䌌ãŠããã
ã«ã¬ã³ããã£ã¬ã¯ããªã® passwd.txt ãã user4 ã®ããŒã¿ãèªã¿åã£ãŠã6ã€ç®ã®ã«ã©ã ãæœåºã㊠requested_path_list.txt ã«è¿œèšããã
$ rm -f passwd.txt
$ rm -f requested_path_list.txt
$ echo 'user4:::::/home/user1:/bin/sh' >> passwd.txt
$ ./cdwdoc-2023-001_solaris2.sh
$ tail requested_path_list.txt
/home/user16ã€ç®ã®ã«ã©ã ãã/home/user1/../../rootãã®ãããªãã®ã«ããŠããšã©ãŒã«ãªãã
$ rm -f passwd.txt
$ rm -f requested_path_list.txt
$ echo 'user4:::::/home/user1/../../root:/bin/sh' >> passwd.txt
$ ./cdwdoc-2023-001_solaris2.sh
error: invalid data
$ tail requested_path_list.txt
tail: cannot open 'requested_path_list.txt' for reading: No such file or directoryãã®ã¹ã¯ãªããã¯å ã»ã©ã® cdwdoc-2023-001_solaris.sh ãšã¯éã£ãŠã6ã€ç®ã®ã«ã©ã ã /home/ ã§å§ãŸã£ãŠãããã©ããã®ãã§ãã¯ã¯ããªãã
ãŸããcase ã«ãããã§ãã¯ã§ã¯ãªã /bin/echo ãš grep ã«ãã£ãŠäœ¿çšäžå¯ãªæååãæ€åºããŠãããã ãã /usr/bin/awk ã gawk ã mawk ã§ãããããªç°å¢ïŒã€ãŸãDebianç³»ãå«ãå€ãã®LinuxïŒã§ä»¥äžã®ããã«ãããšããããŸã§ä»ã®ã»ã¯ã·ã§ã³ã§èª¬æããŠãããããªALTLãªãŒããŒãããŒãèµ·ããããšãã§ããã以äžã¯ /home/user1 ãååšããŠããã®ãåæã§ããã
$ ls -l /home/user1
total 0
$ rm -f passwd.txt
$ rm -f requested_path_list.txt
$ printf 'user4:::::/home/user1/' >> passwd.txt
$ yes '../' | head -43684 | tr -d '\n' >> passwd.txt
$ printf 'root:/bin/sh' >> passwd.txt
$ yes 'h' | head -5000 | tr -d '\n' >> passwd.txt
$ echo >> passwd.txt
$ ./cdwdoc-2023-001_solaris2.sh
./cdwdoc-2023-001_solaris2.sh: 8: /bin/echo: Argument list too long
$ tail requested_path_list.txt
/root
$ uname -a
Linux poge1 5.15.0-69-generic #76-Ubuntu SMP Fri Mar 17 17:19:29 UTC 2023 x86_64 x86_64 x86_64 GNU/Linuxã/rootããšããæååãããã¹ããã¡ã€ã«ã«æžã蟌ãŸããã
äŸã«ãã£ãŠãKnoppix 9.1ã®å Žåã¯ã/rootãã§ã¯ãªãã/UNIONFS/rootãã«ãªãã¯ãã§ããã
ã§ã¯ããããšåãæ¹æ³ãSolaris 11.4ã§ã詊ããŠã¿ãã以äžã¯ /export/home/user1 ãååšããŠããããšãšãrealpath ãGNU coreutilsã®ãã®ã§ããã®ãåæã§ããã
$ pwd
/export/home/user1
$ ls -l /export/home/user1 | head -1
total 4381
$ realpath --version | head -1
realpath (GNU coreutils) 8.27
$ rm -f passwd.txt
$ rm -f requested_path_list.txt
$ printf 'user4:::::/export/home/user1/' >> passwd.txt
$ yes '../' | head -698000 | tr -d '\n' >> passwd.txt
$ printf 'root:/bin/sh' >> passwd.txt
$ yes 'h' | head -5000 | tr -d '\n' >> passwd.txt
$ echo >> passwd.txt
$ ./cdwdoc-2023-001_solaris2.sh
awk: record `user4:::::/export/ho...' too long
awk: record `user4:::::/export/ho...' too long
realpath: '': No such file or directory
$ tail requested_path_list.txt
$ uname -a
SunOS solaris 5.11 11.4.0.15.0 i86pc i386 i86pcSolaris 11.4ã§ã¯ãã# too optimisticãã®ç®æã§ãArgument list too longãã®ãšã©ãŒãèµ·ããããšãããšã/usr/bin/awk ã®å¶éã®ã»ãã«ãåŒã£ãããããšã«ãªããããã«ãããuser_home_dir ã user_shell ã¯å ±ã«ç©ºæååã«ãªãããããã¹ããã¡ã€ã«ã«ã¯äœãæžã蟌ãŸããªãã®ã§ããã
cdwdoc-2023-001_solaris2.sh ã® /usr/bin/awk ã®ç®æã /usr/xpg4/bin/awk ã«å€æŽããŠãã cdwdoc-2023-001_solaris2.sh ãå床å®è¡ããŠãããã¯ã20000ãã€ãïŒ1999ãã€ããŸã§ïŒã®å¶éã«åŒã£ãããããå®ãããŠããã®ã確èªã§ããã¯ãã§ããã
ã§ã /usr/bin/nawk ã /usr/gnu/bin/awk ãªã©ã«å€æŽããŠããå床å®è¡ããå Žåã¯ãSolaris 11.4ã§ããã¯ãALTLãªãŒããŒãããŒãèµ·ãã£ãŠã/rootããæžã蟌ãŸããŠããã®ã確èªã§ããã¯ãã§ããã
ãªãããããã®ãå床å®è¡ãã®éã«ã¯ãpasswd.txt ã¯ãã§ã«çæãããŠããã®ã§äœãçŽãå¿ èŠã¯ãªãã
2023幎3æçŸåšã«ãããŠã¯ãçããŠããã·ã¹ãã ã§ãããªãã /usr/bin/awk ãããã«ãããã®ãã®ã§ãããããªãã®ãæ°è»œã«è©Šãã®ã¯ãVirtualBoxäžã®Solaris 11.4ãé©ããŠããã
Solarisãã©ããªã®ãã¯åãããªãããäžè¬è«ãšããŠåçšUnixã¯åçš®ã³ãã³ãã®åŸ®åŠãªæ¯ãèãã«ã€ããŠå€æŽããªãã§ã»ãããšããèŠæ±ããŠãŒã¶ãŒåŽãããªãããããšãå€ããšããããå€ãã·ã§ã«ã¹ã¯ãªããã®æ¯ãèãã埮åŠã«å€ããããã§ããã
AWKã¯æ±çšçãªããã°ã©ãã³ã°èšèªã«çè¶³ãçªã£èŸŒãã§ãããããªååšã§ã¯ããããã®ãªã®ãªã®ãšããã§DSLã§ãããããããŠã·ã§ã«ã¹ã¯ãªããã«ãããŠã¯ã©ã€ãã©ãªé¢æ°ã®ãããªååšã§ãããã
ãããŠãã®èšèªã«ãããŠãåè¿°ã®ããã«è€éãªãã®ãšåçŽãªãã®ã§å€å°ã®å·®ãã€ãããšããŠãããã©ã€ãã©ãªãä¿¡çšããªãããšããæ¹éãã®ãã®ã¯æ¬è³ªçã«ã¯å ã å·¡ãã®èŠçŽ ãåãã§ããã
äŸãã°ãã§ããã ãæ©ãæ®µéã§ãµã€ãºããã§ãã¯ããŠããã®ãããããšããã®ãçè«äžã¯æ£ãããšããŠãããã®ãµã€ãºã®ãã§ãã¯ã«ã¯èšèªã®åºæ¬æ©èœãããã¯ã©ã€ãã©ãªã䜿ãããã ã
ããããããŠã·ã§ã«ã¹ã¯ãªããã®å Žåã«ãããŠã¯ããŸãã«ããããåºæ¬çãªãã§ãã¯ã«å€éšã³ãã³ãã䜿ããªããã°ãªããªãç¶æ³ããããããšãããããªã®ã§ããã
ã
åé ã®åºé¡ã®è§£çäŸ
ã
â
â
â
â
â
â
ãšããããã§ããã®èšäºã®å é ã«ããåºé¡ã®è§£çäŸã
â
â
â
â
â
â
ã·ã³ãã«ãªè§£çãšããŠã¯ãåã«å·šå€§ãªæååãæž¡ãã°ããã ãããšããããšã«ãªãã
ãã§ã«è§£èª¬éšåãèªãã 人ãªãããArgument list too longãã®ãšã©ãŒã«ã€ããŠç¥ã£ãŠããã¯ãã§ããã
以äžã¯Lubuntu 22.04.1ã§ã®äŸã§ããã
$ str="$(yes 'a' | head -131065 | tr -d '\n')"
$ ./cdwdoc-2023-001_challenge.sh user2 "$str"
./cdwdoc-2023-001_challenge.sh: 17: ./cdwdoc-2023-001_challenge2.sh: Argument list too long
you are a valid user! [ user name : "user2" ]
$ echo $?
0
$ cat /proc/version
Linux version 5.15.0-69-generic (buildd@lcy02-amd64-080) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #76-Ubuntu SMP Fri Mar 17 17:19:29 UTC 2023131065åãaããç¹°ãè¿ããããã®ããã¹ã¯ãŒããšããŠæž¡ãããšã«ãã£ãŠããyou are a valid user!ããåºåãããããšãã§ãããçµäºã¹ããŒã¿ã¹ã 0 ã«ãªã£ãã
ãªããå¿ èŠãªããŒã¿éã¯ç°å¢ã«ãã£ãŠéããã¿ãŒããã«ãã cdwdoc-2023-001_challenge.sh ãèµ·åã§ããçšåºŠã«ã¯å°ããããã¹ã¯ãªããå ã§ cdwdoc-2023-001_challenge2.sh ãå®è¡ããããšããç®æã§ãšã©ãŒãèµ·ããçšåºŠã«ã¯å€§ããããããšããã®ããã€ã³ãã§ããã
Knoppix 7.2.0ãKnoppix 9.1ãå«ãçŸä»£çãªLinuxã§ã¯ã131059 ä»¥äž 131071 以äžãããŸãããç¯å²ã§ããã
Linux以å€ã§ã¯ããgetconf ARG_MAXãã®åºåãåèã«ãªããããããªãã
ãšããã§ããã®èšäºã®ãèµ·ãã£ãŠããããšã«ã€ããŠã®ãããå°ãçŸå®çãªè§£èª¬ãã®ã»ã¯ã·ã§ã³ã®çµç€ãªã©ã§ã¯ãtrue ã³ãã³ããš false ã³ãã³ãã®é察称æ§ã«ã€ããŠç޹ä»ããã
true ãååšããªãå Žåã«ã¯ true ã¯æåŸ ã«åããŠfalsyãªçµäºã¹ããŒã¿ã¹ã«ãªããfalse ãååšããªãå Žåã§ã false ã¯æåŸ éãã«falsyãªçµäºã¹ããŒã¿ã¹ã«ãªãããšãã話ã ã£ãã
ã§ã¯ãããåé ã®åºé¡ã§ cdwdoc-2023-001_challenge2.sh ãååšããªãç¶æ ã ãšã©ã®ãããªåäœã«ãªãã®ã ãããã
å®éã« cdwdoc-2023-001_challenge2.sh ã®ãã¡ã€ã«åããªããŒã ãããªã©ããŠååšããªãç¶æ ã«ããŠããŸããšãã©ããªãã¹ã¯ãŒããå ¥åããŠãããããã¯ãã¹ã¯ãŒãããªãã«ããŠããååšããªããŠãŒã¶ãŒã§ãã£ãŠãããšã«ãããyou are a valid user!ããåãããã«ãªãã
$ mv cdwdoc-2023-001_challenge2.sh cdwdoc-2023-001_challenge2_.sh
$ ./cdwdoc-2023-001_challenge.sh user1 a
./cdwdoc-2023-001_challenge.sh[17]: ./cdwdoc-2023-001_challenge2.sh: not found
you are a valid user! [ user name : "user1" ]
$ ./cdwdoc-2023-001_challenge.sh user1 abcdef
./cdwdoc-2023-001_challenge.sh[17]: ./cdwdoc-2023-001_challenge2.sh: not found
you are a valid user! [ user name : "user1" ]
$ ./cdwdoc-2023-001_challenge.sh user1
./cdwdoc-2023-001_challenge.sh[17]: ./cdwdoc-2023-001_challenge2.sh: not found
you are a valid user! [ user name : "user1" ]å°æ¥çã«èªåã¢ããããŒãã®ãããªæ©æ§ãçµã¿èŸŒãŸãããã®èªåã¢ããããŒãã§ãã¡ã€ã«æŽæ°æã«ãã£ãããã¡ã€ã«ãåé€ãããŠããæ°èŠäœæããããããªãã®ã§ãã£ãå Žåãäžç¬ã ããã¡ã€ã«ãååšããªãæéãååšããããšã«ãªããããããªãã
èªäœã®ã¹ã¯ãªããã«ã€ããŠãæ¢åã®ã³ãã³ãã«ã€ããŠãããããååšããªãç¶æ ã ãšãããã·ã¹ãã å šäœãšããŠã©ããªåäœã«ãªãã ãããããšããå¯èœæ§ãèããŠã¿ãããšã¯ã·ã§ã«ã¹ã¯ãªããã®å ç¢æ§ãé«ããããã§æçšã§ããã
ãããååšããªãå Žåã§ããã»ã©å±éºãªç¶æ ã«ã¯ãªããªãã®ã ãšãããããããããArgument list too longãã®ãšã©ãŒãèµ·ãã£ãŠãããããåé¡ãšã¯ãªããªãã®ã ã
çµå±ããã¹ãŠã®ã³ãã³ãã¯äœãæ³åã ã«ããªãããšã§ãšã©ãŒã«ãªããããããªãã®ã§ããã
æ³åã ã«ããªãããšãšã¯ãäŸãã°ãNo space left on deviceãã®ãããªãã®ãå«ãã
/tmp ãç¬ç«ãããã¡ã€ã«ã·ã¹ãã ã«ãªã£ãŠããLinuxïŒKnoppix 7.2.0ãKnoppix 9.1ãå«ãïŒã§ã¯ããsort -R -S 1Kãã«ãã£ãŠãNo space left on deviceãã®ãšã©ãŒãèµ·ããããããããããªãã
$ seq 99999999 | sort -R -S 1K | head
sort: cannot create temporary file in '/tmp': No space left on deviceäžèšãå®è¡äžã«å¥ã®ã¿ãŒããã«ã§ä»¥äžã®ããã«ãããšãã¿ãã¿ããã¡ã« /tmp ãæµªè²»ãããŠããã®ã確èªã§ããã
$ while :; do du -sh /tmp 2>/dev/null ; sleep 0.5 ; done
290M /tmp
389M /tmp
491M /tmp
599M /tmp
713M /tmp
835M /tmp
961M /tmp
1.1G /tmp
1.3G /tmp
1.4G /tmpãšããã§ããã®èšäºã®ãã·ã§ã«ã¹ã¯ãªããã«ãããçŸå®çãªæ³šæç¹ãã®ã»ã¯ã·ã§ã³ã§ã説æãããã察話çãªãã®ãåæã«ããŠããããã§ã¯ãªããã¹ãŠã®ã·ã§ã«ã¹ã¯ãªããã¯å€éšããåŒã°ããå¯èœæ§ãããããããŠãã®å€éšã®ããã°ã©ã ãšããã®ã¯ã·ã§ã«ã¹ã¯ãªãããšã¯éããªãã
ãšããããã§ãåé ã®åºé¡ã®ã³ãŒãã«ã€ããŠãå€éšã®ããã°ã©ã ããåŒã°ããå Žåã«ã€ããŠãèããŠã¿ãã
äŸãã°ä»¥äžã®ãããªRubyã®ã³ãŒããåããã£ã¬ã¯ããªã«ãã£ããšããã
cdwdoc-2023-001_from_external.rb ( https://gitlab.com/-/snippets/2497177 )
#!/usr/bin/env ruby
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
def user_authenticate(user, password)
system('./cdwdoc-2023-001_challenge.sh', user, password, :err=>'/dev/null')
end
p user_authenticate('user1', 'aaa')
p user_authenticate('user1', 'aaaa')
p user_authenticate('user1', 'a' * 100)
p user_authenticate('user1', 'a' * 131071) # change this line to your env
p user_authenticate('user1', 'a' * 9999999)Kernel.#system ã䜿ã£ãŠãã«ã¬ã³ããã£ã¬ã¯ããªã® cdwdoc-2023-001_challenge.sh ãå®è¡ããŠããããã ã
ãããå®è¡ãããšãã®ããã«ãªãã
$ ./cdwdoc-2023-001_from_external.rb
true
false
false
true
nilå®è¡ç°å¢ã¯ä»¥äžã
$ ruby --version
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux-gnu]
$ cat /proc/version
Linux version 5.15.0-69-generic (buildd@lcy02-amd64-080) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #76-Ubuntu SMP Fri Mar 17 17:19:29 UTC 2023åœç¶ãªãããã'a' * 131071ããšããŠããç®æã¯ç°å¢ã«ãã£ãŠå€ããå¿ èŠããããçŸä»£çãªLinuxãªã倿Žããã«ãã®ãŸãŸäœ¿ãããããããªãã
Pythonçã瀺ããŠããã
cdwdoc-2023-001_from_external.py ( https://gitlab.com/-/snippets/2497177 )
#!/usr/bin/env python3
# written by cleemy desu wayo / see [cdwdoc-2023-001] / Licensed under CC0 1.0
import subprocess
def user_authenticate(user, password):
command_args = ['./cdwdoc-2023-001_challenge.sh', user, password]
try:
process = subprocess.run(args=command_args, stderr=subprocess.DEVNULL)
return process.returncode == 0
except Exception:
return None
print(user_authenticate('user1', 'aaa'))
print(user_authenticate('user1', 'aaaa'))
print(user_authenticate('user1', 'a' * 100))
print(user_authenticate('user1', 'a' * 131071)) # change this line to your env
print(user_authenticate('user1', 'a' * 9999999))å€ãPythonïŒPython 3.4 ããã³ãã以åïŒã§ã¯äžéšã以äžã®ããã«å€æŽããå¿ èŠããããããããªãã
exit_status = subprocess.call(args=command_args, stderr=open('/dev/null', 'w'))
return exit_status == 0ãããå®è¡ãããšãã®ããã«ãªãã
$ ./cdwdoc-2023-001_from_external.py
True
False
False
True
Noneå®è¡ç°å¢ã¯ä»¥äžã
$ python3 -V
Python 3.10.6
$ cat /proc/version
Linux version 5.15.0-69-generic (buildd@lcy02-amd64-080) (gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #76-Ubuntu SMP Fri Mar 17 17:19:29 UTC 2023ãã®ããã«ããã¹ã¯ãŒããæ£ãããã©ããã®å€å®ãããã·ã§ã«ã¹ã¯ãªããããã·ã§ã«ã¹ã¯ãªããã§ãªãããã°ã©ã ããåŒã¶ãããªã·ã¹ãã ã¯å®éã«ååšãããäŸãã°ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®HestiaCPãšããWebã³ã³ãããããã
ããã¯å€§éšåãã·ã§ã«ã¹ã¯ãªãããšPHPã§æžããããã®ã§ããã¹ã¯ãŒããæ£ãããã©ããã®å€å®ãããã·ã§ã«ã¹ã¯ãªãããPHPã®åŽããåŒãã§ããããã ã
ãã®HestiaCPã§ã¯ãã€ã³ã¹ããŒã«åŸã« /usr/local/hestia/bin/ 以äžã«å€§éã®ã·ã§ã«ã¹ã¯ãªããã眮ãããããããã¯ãv-ãã§å§ãŸããã¡ã€ã«åã§ãåäœãšããŠããããªãã«æ©èœããããã©ãŒã¯å ã®VestaCPã®å Žå㯠/usr/local/vesta/bin/ ãšãããã£ã¬ã¯ããªã§ããã
ãããã®ãv-ãã§å§ãŸãã·ã§ã«ã¹ã¯ãªããã®ãã¡ãäŸãã° v-check-user-password ã v-check-user-hash ã /etc/shadow ãçŽæ¥èªããããªãã®ã«ãªã£ãŠããã
PHPã®åŽããã·ã§ã«ã¹ã¯ãªãã v-check-user-password ã v-check-user-hash ãåŒãã§ããç®æã¯äŸãã°ä»¥äžã§ããã
https://github.com/hestiacp/hestiacp/blob/ab8bfddb44d6821b1b4684ca63b6fb8b4dab6f4c/web/api/index.php
ãªã2023幎3æçŸåšãHestiaCPã¯æŽ»çºã«ããŒãžã§ã³ã¢ããããªãããŠãããããã©ãŒã¯å ã®VestaCPã®ã»ãã¯ãããžã§ã¯ããšããŠã¯ãæ®ã©æ»ãã§ãããããã ã
Is Vesta project dead??? · Issue #2006 · serghey-rodin/vesta · GitHub
https://github.com/serghey-rodin/vesta/issues/2006
ãšããã§ããã®èšäºã®åé ã®åºé¡ã«ããã user2 ã®æ£ãããã¹ã¯ãŒãã¯ãh5_#r2iC&qD@A5Fãã§ãããç¹ã«æå³ã¯ãªãã
user3 ã«ã€ããŠã¯ããã¹ã¯ãŒãããªããããããªãã
ããªããããããªãããšããã®ã¯ãããŒã¿ããŒã¹ã®äžã®
636c65656d792064657375207761796f636c65656d792064657375207761796fãšããæååã¯ããã·ã¥å€ã§ã¯ãªãããã ã
ãããã§ãããããããšãå®ã¯äœãã®ããã·ã¥å€ãšããå¯èœæ§ããã£ããããã®ãããããªããçŸæç¹ã§ã¯çè ã«ã¯åãããªãã
ãšãããããããåãããªãéãã¯ãuser3 ã«ã€ããŠã¯äžæ£ãªæ¹æ³ã§ãªããšãyou are a valid user!ããšè¡šç€ºãããããšã¯é£ãããããããªãã
ã
â
â
â
â
â
â
â»ãã®ããäžã«åé ã®åºé¡ã®è§£çäŸãèšèŒãããŠããŸã
â
â
â
â
â
â
ã
倿Žå±¥æŽ
ã
2023-03-26 22:55 JST ãã note.com ã«ãŠåçå ¬é
ïŒâ»ãã以éã®å€æŽã¯ãããŸããïŒ
ã
