【问题标题】:Running a file on remote server by ssh respecting shebang line通过 ssh 尊重 shebang 行在远程服务器上运行文件
【发布时间】:2019-05-02 18:20:39
【问题描述】:

所以我有一个文件。目前它看起来像这样:

#!/usr/bin/env python3
print(1)

我想在远程机器上调整它。最简单的方法是运行

< test.py ssh server-name python3

但是如果我不知道它是一个 python 脚本(或者我可能不知道它是 python3 而不是 python2)并且想要尊重它的 shebang 怎么办?

我试过了

< test.py ssh server-name exec /dev/stdin

但它失败了,因为/dev/stdin 不可执行

为简单起见,我们假设两台服务器都是最新的 Ubuntu。

所以问题是如何运行尊重它的任意脚本shebang?

【问题讨论】:

  • 这通常不是远程运行本地脚本的好方法。它仅在脚本本身不尝试从标准输入读取时才有效。
  • @chepner 这是一个很好的观点(但在我的情况下它并不相关,因为脚本不应该从标准输入读取)

标签: shell command-line sh


【解决方案1】:

这是使用 shebang 行的操作系统:请参阅您的 execve(2) 手册页。脚本文件必须是可执行的,驻留在系统中。

您可以从脚本中提取它以在远程端使用:未经测试:

shebang=$(sed -n '1 {s/^#!//p; q}' test.py)
ssh server-name "$shebang -" < test.py

【讨论】:

  • 这似乎可行,但在一般情况下可能不等效。 (例如,如果没有 shebang,谁知道它是如何工作的,它允许 shebang 中的命令有多个参数等)。将这项工作还给内核会很好。同时,可能 goodol' copy+chmod+run 似乎更值得信赖
最近更新 更多