Bash

Bash 腳本,錯誤“Arg 列表太長”

  • May 8, 2019

我需要在.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.hARG_MAX131072,但是當我這樣做時,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 地址,不是嗎?)

引用自:https://unix.stackexchange.com/questions/517805