1. 程式人生 > >ssh執行遠端命令的坑

ssh執行遠端命令的坑

要做的事情

遠端主機(your.host.com)上部署有docker,期望從本地開發機ssh到遠端主機,在指定的容器中執行命令,基本命令如下:

/usr/bin/ssh -i /home/users/yangjinfeng02/.ssh/.id_rsa  -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no -t [email protected].host.com "sudo docker exec -u rd -it 0284c4594aecc7689de407e8d2aa9106edaf646b000e3c362ad95f6dde5c9f0b bash -c 'pwd'"

出現的問題

登入shell終端,手動執行上面的命令,一切ok。但是放到crontab中無法執行,重定向輸出到檔案,得到如下資訊

Pseudo-terminal will not be allocated because stdin is not a terminal. 

問題排查與解決

注意到ssh命令中的-t引數,是用來控制給ssh分配偽終端。檢視ssh幫助

-T      Disable pseudo-tty allocation.

-t      Force pseudo-tty allocation.  This can be used to execute arbitrary screen-based
programs on a remote machine, which can be very useful, e.g., when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.

注意到上述問題出錯資訊,結合ssh -t引數的含義,
Multiple -t options force tty allocation, even if ssh has no local tty.
可看出問題是在於分配終端引起的。

使用 ssh -t -t 執行,發現crontab下執行正常,問題得以解決。

延伸1——不分配偽終端

既然是終端分配導致的,那麼根據ssh -T引數的含義,是否可以disable偽終端的分配呢?可以進行試驗,執行如下命令

/usr/bin/ssh -i /home/users/yangjinfeng02/.ssh/.id_rsa  -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no -T [email protected].host.com "sudo docker exec -u rd -it 0284c4594aecc7689de407e8d2aa9106edaf646b000e3c362ad95f6dde5c9f0b bash -c 'pwd'"

此時不管是命令列,還是crontab裡,均無法執行。提示如下錯誤資訊

sudo: sorry, you must have a tty to run sudo

出現該問題,是因為sudo命令必須在終端中執行。如果要突破該限制,需要修改/etc/sudoers,有兩種選擇

  1. Replace Defaults requiretty by Defaults !requiretty in your /etc/sudoers. This will impact your global sudo configuration.

  2. Alternatively, you can change this configuration at a per user, per group or per command basis

Defaults!/path/to/my/bin !requiretty
Defaults:myuser !requiretty

延伸2——登入shell和非登入shell的區別

直接在終端裡執行shell命令,與crontab裡執行,本質區別是二者環境變數的差異。

登入shell將查詢4個不同的啟動檔案來處理其中的命令。 bash shell處理檔案的順序如下:
1:/etc/profile
2:/etc/profile.d等待配置檔案
3:HOME/.bashprofileHOME/.bashrc和/etc/bashrc
4:HOME/.bashlogin5:HOME/.profile

非登入shell則按如下順序載入配置檔案
1:/etc/bashrc
2:~/.bashrc

相關推薦

ssh執行遠端命令

要做的事情 遠端主機(your.host.com)上部署有docker,期望從本地開發機ssh到遠端主機,在指定的容器中執行命令,基本命令如下: /usr/bin/ssh -i /home/users/yangjinfeng02/.ssh/.id_rsa

php 利用ssh執行遠端或本地liunx伺服器命令

/** * 利用ssh執行 遠端或本地liunx伺服器命令 * 雖然可以用 shee_exec來執行本地機命令 但卻無法選擇用哪個使用者來執行 此函式可解決此類問題 * $host ssh 主機名 可以為ip 或 域名 * $port ssh 埠 * $ssh_u

自動scp然後ssh登入,執行遠端命令

#!/usr/bin/expect set password 123456 set host 191.168.4.249 set command "rmmod pcie_loader.ko &

java 通過 ssh 執行 shell 命令

public abstract class Shell implements AutoCloseable{ abstract boolean executeCommands(String... commands); abstract Strin

如何使用 PsExec 執行遠端命令

前言 這緊緊只是一篇純技術分享。我們的程式在執行時需要連線多臺目標機器,並拷貝目標機器上特定資料夾中的檔案。為了方便訪問,要在每臺目標機器上建立一個特定使用者,所以 PsExec 成了實現此功能的一個方案(雖然已經被棄用)。 PsExec 簡介 PsExec工具包含在

java中利用jsch執行遠端命令,實現sftp

利用jsch可以執行遠端命令並實現sftp檔案傳輸,以下為自定義的util: import com.jcraft.jsch.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; impor

ssh執行遠端伺服器需要sudo提權的指令碼

前言 運維是件很神奇的工作,牛逼的運維很輕鬆可以搞定很複雜的任務,sb的運維天天時間都耗上可能也解決不了問題(ps:因為他把時間都花在了可以重複執行的事情上) 在寫這篇部落格之前,我google了一堆相關文章,大都是說修改/etc/sudoers,然後NOPASSWD:指

zabbix3.4監控tomcat的cpu,並執行遠端命令

** ** zabbix 指令碼內容: #!/bin/bash ser=$1 /usr/bin/top -b -n 1 > /tmp/.top.txt spid=$(/usr/b

通過SSH遠端伺服器(不登陸)執行命令

背景:在運維工作中需要遠端管理多臺linux伺服器,並在伺服器上執行指令碼/命令來收集相關資料。為了提高運維效率,整理以下指令碼 前期準備:設定跳板機免密碼登陸到伺服器 指令碼: 以下指令碼實現功能,在遠端伺服器192.168.4.12儲存主機名到/opt/hostname [[em

ssh無密碼登入遠端主機執行特定命令的注意事項

最近的一個專案要結合使用rabbitmq、keepalived、supervisor。其中的一個場景為某個keepalived例項被提升為MASTER後需要到部署了rabbitmq client的遠端主機上kill掉這些client程序。 一般的思路為配置keepalive

ssh免密碼遠端執行sudo命令

目的是執行下面的命令不需要輸入任何密碼! >ssh [email protected] "sudo command" 1. 在本地機器上生成祕鑰對兒 ssh-keygen -t rsa 一路回車後生成在~/.ssh/目錄下生成兩個檔案id_rsa和id

使用parallel-ssh批量執行遠端shell命令

pssh使用場景 假設現在需要對數百臺伺服器節點進行配置更新或者執行一些簡短command,而目前並沒有完備的部署工具軟體, 那可以選擇向pssh這樣的並行登入遠端終端並執行指定命令的shell工具。 以前機器節點少的時候,直接用shell寫個for迴圈來執

Python免祕鑰ssh遠端登入執行命令and本地執行shell命令

python遠端執行 python paramiko 模組的應用 環境 # yum install python-dev # yum install python-devel # pi

linux ssh遠端伺服器執行命令和crontab中執行命令提示命令找不到的問題

使用ssh ip "hadoop" 命令時,提示找不到hadoop命令。 因為hadoop是在/etc/profile配置的,ssh到一臺伺服器上時,會執行使用者環境。 而ssh到一臺伺服器上,帶著命

ssh遠端執行nohup命令不退出

Linux系統下,使用預設使用者root。遠端target機器的主目錄下有個指令碼test.sh,可執行許可權,內容只有一條命令:sleep 10 在本地機器上執行 ssh target "nohup ./test.sh &",結果ssh不立即退出,等test.sh

python3 實現多執行ssh 批量遠端執行命令

需要模組:paramiko pip3 install paramiko import paramiko import sys import getpass def rcmd (host,password,cmd,port=22,username='root'):

ssh 遠端執行遠端機上的指令碼或命令

單命令執行: ssh [email protected] "cd /home ; ls" 今天 遠端執行命令發現了一個問題: 當執行下面命令 ssh -o ConnectTimeout=60 -qn [email protected] "cd

遠端採集伺服器指標資訊(一) 遠端通過SSH執行命令

遠端採集伺服器資訊,比如說磁碟資訊、記憶體資訊。 現介紹java通過SSH執行命令採集伺服器資訊,比如說執行df、ls、top。 /** * * SSH遠端執行shell類 */ public class SSHSession implements IRemoteSession {

Python多線程登錄遠端linux執行操作命令

Python多線程登錄遠端linux執行什麽是進程?進程,就是程序的一個運行狀態。 什麽是線程?為什麽要使用線程? 線程,是進程內部的“執行單元”。一個進程,可以包含多個線程,每個線程又可以執行不同的代碼。即,通過多個線程,可以使一個進程同時執行多個功能!前提安裝sshpass解法1.#!/usr/bin/p