AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 533276
Accepted
Daywalker
Daywalker
Asked: 2013-08-24 06:13:46 +0800 CST2013-08-24 06:13:46 +0800 CST 2013-08-24 06:13:46 +0800 CST

debian bash/sh 字符串执行

  • 772

我在这里被这段代码困住了

user@server:~$ TEST="ssh rsync@otherserver.example.org 'date; hostname -A; uname -a'"
user@server:~$ $TEST
bash: date; hostname -A; uname -a: Command not found.

我想在 shell 脚本中使用它,但不知道是什么问题。两个系统都是debian wheezy,

但是如果直接执行命令:

user@server:~$ ssh rsync@otherserver.example.org 'date; hostname -A; uname -a'
Fre Aug 23 20:02:55 CEST 2013
otherserver.example.org
Linux otherserver 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux

那么这里有什么大不了的????我中继错过了一些非常琐碎的事情,但无法弄清楚......请帮助......

这背后的想法是,我在脚本中构建了一个长字符串并在单个 SSH 会话中远程执行它(将 zfs 快照重命名为 n.0 变成 n.1 等等)

但它不工作是希望它工作......

编辑/更新:更新了对我的问题的更深入理解的例子(从“日期;日期;日期”到“日期;主机名 -A;uname -a”)

感谢您迄今为止的所有回复。起初 eval 有效,但如用户所述,似乎已被弃用。所以我的工作就是再次弄清楚如何改变它。

必须如此构建的字符串女巫看起来像这样:

echo "Rearanging snapshots..."
        last_backup=7
        first_backup=0
        RENAME_STRING="'sudo zfs destroy $BACKUP_DATASTORE@n.$last_backup; "
        while [ $last_backup -gt $first_backup ]
        do
                RENAME_STRING=$RENAME_STRING"sudo zfs rename $BACKUP_DATASTORE@n.$(($last_backup - 1)) $BACKUP_DATASTORE@n.$last_backup"

            if [ $(($last_backup - 1 )) -gt $first_backup ]
            then
                    RENAME_STRING=$RENAME_STRING"; "
            else
                    RENAME_STRING=$RENAME_STRING"'"
            fi

            last_backup=$(($last_backup - 1 ))
    done

    #CURRENTLY SOLVED WITH EVAL as this one doesn't work...
    #remote_cmd=(/usr/bin/ssh "$BACKUP_USER@$HOST_TO" "$RENAME_STRING")
    #"${remote_cmd[@]}"
    eval /usr/bin/ssh $BACKUP_USER@$HOST_TO $RENAME_STRING

所以也许你们会有更优雅的方法来解决这个问题?

编辑2:

这个输出“OK”吗?(好吧,就像不弃用的方式一样,并且可以很好地使用?

user@server:~$ TEST="date ; hostname -A ; uname -a"
user@server:~$ ssh rsync@otherserver.example.org <<< "$(printf '%s ' $TEST)"
Pseudo-terminal will not be allocated because stdin is not a terminal.
Linux otherserver 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Fre Aug 23 20:13:53 CEST 2013
otherserver.example.org 
Linux otherserver 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux

EDI3:更新/改进 (?) while loop eval 仍用作 <<< 在脚本中不起作用...

bash
  • 5 5 个回答
  • 555 Views

5 个回答

  • Voted
  1. Valentin Bajrami
    2013-08-24T06:54:18+08:002013-08-24T06:54:18+08:00

    通过 ssh 远程执行本地命令的建议方法是不使用 eval。这是不鼓励的。由于您将整行存储在变量中,因此您可以

    mydate=$(date; date; date); 
    ssh rsync@example.org bash <<< "$(printf 'echo %q ' "$mydate")"
    

    Eval 应该只用于不提供安全工具的遗留系统,如我向您展示的示例。

    这会产生与您使用交互式 shell 运行这些命令完全相同的结果。

    希望它至少能给你一些想法。

    更新以演示命令如何也可以远程运行,而无需定义本地变量。

    ssh rsync@example.com bash <<< "$(printf '%s ' "whoami && ps aux")"
    
    • 3
  2. dsmsk80
    2013-08-24T06:16:39+08:002013-08-24T06:16:39+08:00

    尝试 shell/bash 内置eval命令:

    $ help eval
    eval: eval [arg ...]
    
    Execute arguments as a shell command.
    
    Combine ARGs into a single string, use the result as input to the shell,
    and execute the resulting commands.
    
    Exit Status:
    Returns exit status of command or success if command is null.
    
    • 2
  3. 200_success
    2013-08-24T10:35:53+08:002013-08-24T10:35:53+08:00

    没有理由编写如此长的命令字符串以通过 SSH 运行。只需在调用的远程主机上创建一个永久脚本/usr/local/sbin/rotate_backups并使用ssh $USER@$HOST 'sudo /usr/local/sbin/rotate_backups'.

    如果您在“Unix & Linux” StackExchange 上问这个问题,那么这可能是一个有趣的问题。但是,作为系统管理员,您的目标应该是可维护性和安全性。如果你无法理解你的剧本,你的同事和继任者会诅咒你。

    • 2
  4. Dennis Williamson
    2013-08-24T13:36:27+08:002013-08-24T13:36:27+08:00

    尝试这个:

    user@server:~$ remote_cmd=(ssh rsync@otherserver.example.org 'date; hostname -A; uname -a')
    user@server:~$ "${remote_cmd[@]}"
    

    它创建一个数组并按照BashFAQ/050第 3 项中的建议执行它。

    • 2
  5. Best Answer
    Daywalker
    2013-08-27T02:33:57+08:002013-08-27T02:33:57+08:00

    发现问题

    我从单曲开始我的长串,'从单曲开始'

    现在我自己保留所有单引号(')创建字符串并在末尾添加双引号,所有工作!

    #!/bin/sh
    ...
    #[SOME_CODE_HERE]
    ...
    echo "Rearanging snapshots..."
    last_backup=7
    first_backup=0
    RENAME_STRING="sudo zfs destroy $BACKUP_DATASTORE@n.$last_backup; "
    while [ $last_backup -gt $first_backup ]
    do
            RENAME_STRING=$RENAME_STRING"sudo zfs rename $BACKUP_DATASTORE@n.$(($last_backup - 1)) $BACKUP_DATASTORE@n.$last_backup; "
            last_backup=$(($last_backup - 1 ))
    done
    /usr/bin/ssh $BACKUP_USER@$HOST_TO "$RENAME_STRING"
    

    那么有人可以向我解释一下,为什么我不能在我的变量中设置引号?

    这个结构现在工作得很好。谢谢大家的帮助!我希望我的回答也能帮助别人!(后面会整理 ALL_CAPITAL 的东西;))

    • 0

相关问题

  • Mac OS X:从 python 脚本中更改 $PATH

  • Bash 脚本:要求脚本以 root 身份运行(或使用 sudo)

  • crontab ifconfig 什么都不输出

  • 使用命令行工具按排序顺序计算重复项

  • 是否有 bash 等效于 ruby​​ 的“一些内容#{foo}”?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve