Bash
Bash 腳本,錯誤“Arg 列表太長”
我需要在
.lua
文件中執行 bash 腳本:os.execute ("/path/to/file.sh")
file.sh:
#!/bin/bash route add 149.36.98.78 reject
file.sh 的權限是
[-rwxr-x---] root www-data
我收到錯誤“Arg list too long”,如果我將 bash 程式碼直接放在 lua 中,我會得到相同的錯誤:
os.execute ("route add 149.36.98.78 reject")
所以它認為這是因為整個 bash 程式碼是在引號內執行的,參考:https ://stackoverflow.com/q/11475221/10286151
這是我的limits.h中的常量:
#ifndef _LINUX_LIMITS_H #define _LINUX_LIMITS_H #define NR_OPEN 1024 #define NGROUPS_MAX 65536 /* supplemental group IDs are available */ #define ARG_MAX 131072 /* # bytes of args + environ for exec() */ #define LINK_MAX 127 /* # links a file may have */ #define MAX_CANON 255 /* size of the canonical input queue */ #define MAX_INPUT 255 /* size of the type-ahead buffer */ #define NAME_MAX 255 /* # chars in a file name */ #define PATH_MAX 4096 /* # chars in a path name including nul */ #define PIPE_BUF 4096 /* # bytes in atomic write to a pipe */ #define XATTR_NAME_MAX 255 /* # chars in an extended attribute name */ #define XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ #define XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ #define RTSIG_MAX 32 #endif
我該如何解決?我試圖將其更改
ARG_MAX
為:ARG_MAX 29107299
但這並沒有改變任何東西。我使用 Ubuntu 16。
當我對此進行搜尋時,我意識到這個問題是由於文件,而
ARG_MAX
定義ARG_MAX
的是文件/usr/include/linux/limits.h
,但我不確定因為在文件中limits.h
我ARG_MAX
是131072
,但是當我這樣做時,getconf ARG_MAX
我得到了2621440
您在PasteBin中引用的錯誤列表會誤導您。
您收到的錯誤是 7 號,但這是程序退出程式碼,幾乎可以肯定不是系統錯誤程式碼。它們完全不相關。
我相信實際的問題只是你試圖添加相同的拒絕路線兩次:
# route add 152.48.25.29 reject; echo SS=$? SS=0 # route add 152.48.25.29 reject; echo SS=$? SIOCADDRT: File exists SS=7
route
如果您嘗試刪除不存在的路由,您也會得到相同的退出程式碼:# route delete 152.48.25.29 reject; echo SS=$? SS=0 # route delete 152.48.25.29 reject; echo SS=$? SIOCDELRT: No such process SS=7
要解決這個問題,您需要管理您的包裝器。您可以在嘗試添加之前測試拒絕路由,也可以簡單地丟棄錯誤返回。此範例支持第二種(簡單化)方法,但您可能需要採用另一種選擇:
#!/bin/bash route add 152.48.25.29 reject 2>/dev/null exit 0
(您確實知道如何使用和朋友向腳本傳遞和引用參數
"$1"
,而不是逐字嵌入 IP 地址,不是嗎?)